1和0在date add函数中做什么?

f87krz0w  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(323)
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。

9nvpjoqh

9nvpjoqh1#

在SQLServer中,在日期时间和整数之间有一些相当难看的隐式转换。 0 ,当转换为日期时,变为 1900-01-01 .
你也可以在约会时做数学。加减法 1 从日期加上或减去1天。综合这些事实,我们得出:

dateadd(yy, (
        DATEPART(YEAR, GETDATE()) + (
            CASE 
                WHEN DATEPART(MONTH, GP_DATE) > 10
                    THEN 0
                ELSE 1
                END
            ) - 1900
        ), 0)

取当前年份,再减去1900(如果月份小于11,则为1899,无论出于何种原因)。然后我们把这个数字加回日期 0 (如上所述 1900-01-01 ). 结果是我们得到了明年或今年的1月1日,这取决于 GP_DATE . 叫这个 D1 .
继续:

dateadd(mm, DATEPART(MONTH, GP_DATE) - 1, 0)

要花一个月的时间 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 是。然而,它似乎也从未在考虑闰年的情况下进行过测试。
更可能正确的查询版本是:

SELECT
DATEADD(year,
   DATEDIFF(year,GP_DATE,CURRENT_TIMESTAMP) +
   CASE WHEN DATEPART(month,GP_DATE)>10 THEN 0 ELSE 1 END
,GP_DATE)

相关问题