TSQL В чем разница между использованием дд-мм-гггг и гггг-мм-дд - PullRequest
4 голосов
/ 21 марта 2019

У меня есть довольно простой вопрос из интереса.В T-SQL (SSMS или подобном), какая разница, «за кадром», между использованием dd-mm-yyyy и yyyy-mm-dd в операторе where.

Например, эти два запроса дают мнеразные результаты

select * from DB..table where application_date > '01-01-2019' and application_date < '01-06-2019' order by app_ID;

select * from DB..table where application_date > '2019-01-01' and application_date < '2019-06-01' order by app_ID;

Кажется, что первое является подмножеством второго.Для сравнения, первая дает мне 83 записи, а вторая дает более 11 тысяч с изменениями.

Было бы интересно понять, если бы кто-то мог просветить меня.

Ответы [ 2 ]

5 голосов
/ 21 марта 2019

Строковые представления значений 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.
4 голосов
/ 21 марта 2019

Литерал '01-06-2019' фактически интерпретируется как 2019-01-06, что не то же самое, что 2019-06-01, который использует второй запрос.

Вы можете прочитать документацию по SQL Server , охватывающую поддерживаемые форматы литералов даты. Но в целом, старайтесь придерживаться форматов даты ISO, которые поддерживаются практически каждой базой данных SQL. Итак, вторая версия вашего запроса - та, которую вы всегда должны использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...