Don't do it that way.
Firstly, do not concatenate strings to build a SQL command. It leaves you wide open to accidental or deliberate SQL Injection attack which can destroy your entire database. Use Parametrized queries instead.
Secondly, doing it by concatenating strings takes the date from a generic data value to a culture sp[ecific value (based on wheatever culture your server pc was set to, almost certainly not what you wanted) and then expects Sql (probably on a different server complelty) to reverse the convertion and turn it back into a DateTime value again. But SQL assumes yyyy-MM-dd format which your web server is almost certainly not set to use.
Leave it as a DateTime, and pass it through as such via a parametrised query. It will probably fix your problem and make your code safer, more maintainable, and more readable as well!
con.Open();
Sql = "insert into BirthDayWish values(@NM, @FD, @MO, @TD, 'a', @EM)";
SqlCommand cmd = new SqlCommand(Sql, con);
cmd.Parameters.AddWithValue("@NM", txt_name.Text);
cmd.Parameters.AddWithValue("@FD", FromDate.SelectedDateValue);
cmd.Parameters.AddWithValue("@MO", txt_mobile.Text);
cmd.Parameters.AddWithValue("@TD", Todate.SelectedDateValue);
cmd.Parameters.AddWithValue("@EM", txt_Email.Text);
cmd.ExecuteNonQuery();
BTW: It is a bad idea to leave out the names of the columns you are inserting - if they are not in exactly the order you expect, then either the date will be inserted in the wrong columns, or you will get an error. Always list the colum,ns - it makes your code more robust and better capable to cope with future changes.