Используйте параметризованные запросы. Они поддерживаются практически всеми технологиями доступа к данным, которые вы можете использовать. И они позволяют вам рассматривать даты как даты, а не преобразовывать все в строки.
например. (ADO.Net SqlCommand)
SqlCommand cmd = new SqlCommand("Insert into Books (Name,PublishDate,IsInternal) Values (@Name,@PublishDate,@IsInternal)");
cmd.Parameters.Add(new SqlParameter("@Name", System.Data.SqlDbType.VarChar, 50));
cmd.Parameters.Add(new SqlParameter("@PublishDate", System.Data.SqlDbType.DateTime));
cmd.Parameters.Add(new SqlParameter("@IsInternal", System.Data.SqlDbType.Bit));
cmd.Parameters["@Name"].Value = book.Name;
cmd.Parameters["@PublishDate"].Value = book.PublishedDate;
cmd.Parameters["@IsInternal"].Value = book.IsInternal;
Самый большой источник ошибок, которые люди делают, когда сообщают о проблемах типов данных между своим клиентским кодом и базой данных SQL, - это то, где по какой-то причине они преобразовали все в строки. Мало того, что это обычно менее эффективно, но вы также полагаетесь на то, что по крайней мере два преобразования должны выполняться правильно (Тип -> строка и строка -> Тип), и часто, по крайней мере, одно из этих преобразований будет оставлено на любой Функции преобразования по умолчанию: