dateadd(mm, DATEPART(MONTH, DATE) - 1, 0) + DATEPART(DAY, DATE) - 1
输出日期以年份为单位,例如1990-12-02 00:00:00:000
完整查询如下:
SELECT dateadd(yy, (
DATEPART(YEAR, GETDATE()) + (
CASE
WHEN DATEPART(MONTH, GP_DATE) > 10
THEN 0
ELSE 1
END
) - 1900
), 0) + dateadd(mm, DATEPART(MONTH, GP_DATE) - 1, 0) + DATEPART(DAY, GP_DATE) - 1 GP_DATE
from table
我正在尝试将此查询转换为雪花语法,雪花语法dateadd函数不允许1,0。
1条答案
按热度按时间9nvpjoqh1#
在SQLServer中,在日期时间和整数之间有一些相当难看的隐式转换。
0
,当转换为日期时,变为1900-01-01
.你也可以在约会时做数学。加减法
1
从日期加上或减去1天。综合这些事实,我们得出:取当前年份,再减去1900(如果月份小于11,则为1899,无论出于何种原因)。然后我们把这个数字加回日期
0
(如上所述1900-01-01
). 结果是我们得到了明年或今年的1月1日,这取决于GP_DATE
. 叫这个D1
.继续:
要花一个月的时间
GP_DATE
,减去1
再加上这个月数0
(1900-01-01
). 结果是一个月的第一个月GP_DATE
在,但在1900
. 我们称之为D2
.当我们加上
D1
以及D2
加起来,我们大约得到一个日期的第一个月GP_DATE
在今年或明年。但是请注意,如果D1
一年是闰年,我们在闰年之后的几个月里每天都会出错February
.最后,我们采取行动
DATEPART(DAY, GP_DATE) - 1
,一个月的一天从哪里开始GP_DATE
,减去1
,再加上我们目前的结果。这应将最终日期设置为每月的同一天GP_DATE
,除了上述错误。因此,代码似乎试图
GP_DATE
今年或明年的日期是一样的,取决于一年中的晚些时候GP_DATE
是。然而,它似乎也从未在考虑闰年的情况下进行过测试。更可能正确的查询版本是: