The main problem is that you concatenate the values directly to the SQL statement. This leaves you wide open to SQL injections and also causes problems since you're relying on implicit conversion from character data to datetime.
The cure is to use parameters. In other words your code should look something like
DataTable dt = new DataTable();
SqlCommand sc = new SqlCommand();
sc.CommandText = "Select * from patient where Date between @date1 and @date2";
sc.Connection = myconnection;
sc.Parameters.AddWithValue("@date1", dateTimePicker1.Value);
sc.Parameters.AddWithValue("@date2", dateTimePicker2.Value);
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = sc;
sda.Fill(dt);
dataGridView1.DataSource = dt;
(Sorry for possible typos)
Also you should use using blocks to ensure proper disposal of commands, connections and so on.
I'd also recommend reading
Properly executing database operations[
^]