К сожалению, 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
.Потому что, действительно, это не имеет смысла.