Функция даты T-SQL со значениями Integer в качестве параметра даты - PullRequest
1 голос
/ 11 апреля 2019

Я пытался изменить устаревший запрос и наткнулся на этот блок кода

select   DATEADD(MONTH, DATEDIFF(MONTH, -1,getdate() )-1, 1)

Но, по моему мнению, функциям dateadd и datediff для вычисления необходим некоторый параметр даты. Но здесь DateDiff и DateAdd имеют некоторые целочисленные значения в месте параметра Date

Например, DATEDIFF (MONTH, -1, getdate ()) -1 возвращает 1431, которое является просто десятичным значением, но блок кода в соответствии с документацией ищет параметр Date.

https://www.w3schools.com/sql/func_sqlserver_datediff.asp

То же самое в случае с DateAdd

Кто-то, пожалуйста, поделитесь объяснением

1 Ответ

5 голосов
/ 11 апреля 2019

К сожалению, DATEADD и DATEDIFF определены для работы с datetime (а также с любыми новыми типами данных datetime).Таким образом, они наследуют большую часть мерзости старого типа, включая то, что неявные преобразования из int в datetime допускаются 1 .

0 преобразуется в 1900-01-01.-1 преобразуется в 1899-12-31.1 преобразуется в 1900-01-02.Короче говоря, целое число преобразуется в день «столько дней» после 1900-01-01.

Но давайте посмотрим на ваш код.Он вычисляет разницу в месяцев от 1899-12-31, а затем, вычтя единицу, добавляет то же количество месяцев к 1900-01-02.Чистый эффект этого - дать вам 2-е число текущего месяца.

Существуют более простые способы написать это, даже сохранив ту же структуру:

select DATEADD(MONTH, DATEDIFF(MONTH, 0, getdate() ), 1)

Или используя DATEFROMPARTS, что является предпочтительным, потому что это делает явным / очевидным то, что вы делаете , а использует более современный тип данных (date).


1 Вам даже не разрешено явное преобразование из int в datetime2.Потому что, действительно, это не имеет смысла.

...