SSMS DATEADD использует неправильный формат региона

#sql #sql-server #dateadd #regional-settings

Вопрос:

По какой-то причине специально только функция DATEADD использует формат региона гггг-дд-мм вместо обычного гггг-мм-дд для всего остального. Я не понимаю, почему это произошло, я даже не американец.

Для меня DATEADD(день, 7, ‘2021-09-01’) в качестве столбца возвращает дату и время 2021-01-16 00:00:00.000, а не ожидаемый 2021-09-08 00:00:00.000.

Кто-нибудь знает, известна ли эта проблема в SSMS с функцией DATEADD? Я использую SQL Server Management Studio v17.9.1

Ответ №1:

Это не проблема с SQL Server Management Studio (SSMS), которая является просто IDE для SQL Server (сказать нам, что вы используете SSMS 17, все равно что сказать нам, что вы используете Office 2016, когда вас спрашивают, какую версию Windows вы используете), и не SQL Server, а ваши буквальные строки. Во-первых, то, против чего вы действительно должны использовать DATEADD , — это строго типизированное значение даты и времени; тогда вы всегда получаете ожидаемое значение.

Что касается ваших буквальных строк, однако, формат yyyy-MM-dd не является однозначным, поскольку способ его интерпретации отличается при использовании (старого) datetime и smalldatetime типов данных. DATEADD DATEDIFF ) неявно преобразует строковый тип данных в a datetime ; и такое преобразование интерпретируется в соответствии с вашими языковыми настройками (это означает, что ваш формат неоднозначен).

Поэтому исправление состоит в том, чтобы использовать однозначный формат. Для SQL server это yyyyMMdd и yyyy-MM-ddThh:mm:ss.nnnnnnn . Так DATEADD(day, 7, '20210901') что вернется 08 сентября 2021 года независимо от ваших языковых настроек.

Комментарии:

1. Спасибо, что использование «20210901» работает так, как ожидалось, в отличие от «2021-09-01». Я не уверен, что полностью понимаю, о чем вы говорите, но, думаю, мне нужно кое-что почитать о типах данных «строго типизированные дата и время» и «дата-время». Действительно ценю объяснение, несмотря ни на что.

2. Типы дат и времени @SandGrug .