T-SQL заменяет день и месяц при установке значения переменной datetime в SQL Server 2017

Когда я устанавливаю значение переменной datetime, день и месяц переключаются.

Например:

declare @date datetime = '2017-12-02 14:56:24.000'
select datepart(month,@date)

Результат должен быть 12, но это 2. Проблема существует только на SQL Server 2017. Тот же код на 2016 возвращает 12.


person Jakub Suszczyński    schedule 02.12.2017    source источник
comment
Используйте формат, не зависящий от языка или других параметров подключения, как предлагает @lad2025. Чтобы лучше понять это, прочтите это   -  person SMor    schedule 02.12.2017
comment
почему вы используете datetime вместо datetime2? у вас не было бы этой проблемы там?   -  person Martin Smith    schedule 02.12.2017
comment
Одна из многих причин, почему следует отказаться от использования DATETIME и вместо этого использовать тип данных DATETIME2(n), представленный в SQL Server 2008. Этот тип данных НЕ показывает такое же поведение - дата и время всегда правильно интерпретируются так, как вы ожидаете.   -  person marc_s    schedule 02.12.2017
comment
Использование datetime2 ничего не меняет, как я тестировал.   -  person Jakub Suszczyński    schedule 02.12.2017
comment
Да, это так. используя rextester из принятого вами ответа rextester.com/LDX87286   -  person Martin Smith    schedule 02.12.2017
comment
Использование DATETIME2(3) вместо DATETIME РАБОТАЕТ просто работает — протестировано на SQL Server 2014, 2016 и 2017. Везде одинаковое поведение   -  person marc_s    schedule 03.12.2017


Ответы (1)


Проблема существует только в SQL Server 2017. Тот же код в 2016 году возвращает 12.

Это не зависит от версии SQL Server, просто разные DATEFORMAT настройки:

SET DATEFORMAT ymd; 
declare @date datetime = '2017-12-02 14:56:24.000';
select datepart(month,@date);
-- 12

SET DATEFORMAT ydm;
declare @date2 datetime = '2017-12-02 14:56:24.000';
select datepart(month,@date2);
-- 2

Демонстрация Rextester


Чтобы избежать этого, я предлагаю использовать независимый от культуры формат даты ISO-8601.

declare @date datetime = '2017-12-02T14:56:24.000';

Rextester Demo2

или как marc_s предложил изменить тип данных на DATETIME2:

DECLARE @date DATETIME2 = '2017-12-02 14:56:24.000';

Демонстрация Rextester 3

person Lukasz Szozda    schedule 02.12.2017
comment
Или просто используйте DATETIME2(n) вместо DATETIME - рекомендация, начиная с SQL Server 2008 .... - person marc_s; 02.12.2017