При формировании sql запросов очень часто используются строчные значения даты. Все бы хорошо, но формат этих строк зависит от региона, точнее говоря от региональных настроек сервера и клиента и скрытых преобразований формата datetime внутри разных программ и библиотек. Иначе говоря, от множества переменных параметров, не зависящих от программиста. Все это приводит к классическому кошмару программиста - когда один и тот же код выполняется по-разному в зависимости от непредсказуемых внешних условий (например выполняется из SQL Managment Studio и вылетает в C#, или вылетает на отсылке на сервер прочитанных с него же данных). Характерным признаком подобных проблем является ошибка "The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value."
Но не стоит отчаиваться, спасение есть, в MS SQL Server существует универсальный формат строки даты, не зависящий от всего этого ужаса - ГГГГММДД или 20120201 для 1 февраля 2012 . Получить такую строку из DateTime или произвольной строки даты можно следующим образом:
string sqlDateStr = Convert.ToDateTime(dateStr).ToString("yyyyMMdd");
Вообще-то этот формат пришел из стандарта 8601 и для даты и времени можно использовать такую строку в соответствии со стандартом
select cast('2014-01-24T11:19:00.000' as datetime)
TSQL DATETIME ISO 8601
Universal Date format to insert date in to SQL Server? Shock