Строковые представления значений datetime
зависят от культуры.
Например, в США формат представления строки - MM/dd/yyyy
, а в Великобритании - dd/MM/yyyy
.
Это означает, что SQL Server преобразует строковые литералы в datetime
на основе настроек языка, в частности, это DATEFORMAT
- если формат представления строки не соответствует стандарту ISO 8601 - или yyyy-MM-ddTHH:mm:ss
или yyyyMMddTHHmmss
.
Однако существует небольшая известная ошибка (или функция) с типом данных DateTime
: при преобразовании значений только для даты из строки, отформатированной как yyyy-MM-dd
, преобразование по-прежнему зависит от настроек культуры - при преобразовании из Альтернативный формат ISO 8601 yyyyMMdd
абсолютно безопасен для всех типов данных datetime.
Вероятно, это связано с тем, что этот формат не является уникальным для ISO 8601 - он также является частью канонического формата ODBC - который является yyyy-MM-dd HH:mm:ss
- почти таким же, как ISO 8601, только с пробелом вместо T в качестве разделителя между частью даты и частью времени.
Эта ошибка существует только в типе данных DateTime
и является одной из нескольких причин, по которой вам всегда следует работать с более новым и улучшенным типом данных DateTime2
.
для получения дополнительной информации читайте Преобразование даты и культура: разница между датой и датой.
TL; DR;
Единственный безопасный формат даты представления строки для работы с datetime
- это yyyyMMdd
.
все другие форматы преобразования зависят от культуры и могут привести к ошибкам или худшим - неправильным результатам.
Основные моменты:
- Когда вы можете, предпочтите
DateTime2
над datetime
.
- Когда вы можете, предпочтите избегать строковых представлений
datetime
.
- Когда вам нужно работать со строковыми представлениями
datetime
, всегда работайте с одним из форматов ISO 8601 - либо yyyy-MM-ddTHH:mm:ss
, либо yyyyMMddTHHmmss
- Когда вам нужно работать только с
DateTime
и строковыми представлениями только даты, всегда используйте yyyyMMdd
.