1

我正在尝试获取最后一个月,为此我编写了以下内容来计算编号。从今天到最后一天的天数。

    select datediff(DAY,GETDATE(),dateadd(m,1,getdate()))-GETDATE()

粗体部分给了我不。从今天到一个月后的天数,比如 30 或 31。然后我从 30 或 31 中减去今天的日期,即“-getdate()”

上述查询的输出是

1786-06-06 11:44:30.540

您能否解释一下查询中发生了什么?我不是在寻找解决方案,我想知道 SQL-Server 如何解释查询。

谢谢。:)

4

2 回答 2

10

表达式的粗体部分不返回日期,它返回天数:

31

将其转换为日期时间:

SELECT CONVERT(DATETIME, 31);

这是第 0 天 ( )之后1900-01-01的 31 天:

1900-02-01

现在,减去GETDATE()一个整数(41512第 0 天后的天数):

SELECT 31 - 41512 = -41481

现在将 -41481 天添加到第 0 天:

SELECT DATEADD(DAY, -41481, 0);
-- or
SELECT DATEADD(DAY, -41481, '19000101');

或者:

SELECT CONVERT(DATETIME, 31 - CONVERT(INT, GETDATE()));

现在,我强烈推荐几件事:

  1. 不要使用隐式日期数学。@date_var_or_col - 1例如,使用新的数据类型(如DATE和)失败DATETIME2
  2. 不要使用速记如m. 如果你的意思是MONTH,只需承受巨大的生产力冲击并输入MONTH。要了解原因,请告诉我这是否提供了您期望的结果:

    SELECT DATEPART(y, GETDATE()), DATEPART(w, GETDATE());
    
于 2013-08-27T16:25:41.853 回答
2

我从 30 或 31 中减去今天的日期,即“-getdate()”

听起来您完全了解正在发生的事情,但可能不了解结果。

您正在隐式转换GETDATE()为一个数字,该数字表示自1/1/1900 12:00:00 AM

当您从 中“减去” GETDATE()(截至 2013 年 8 月 27 日为 41,511)3031您得到 -41,480 或 41,480 天 1/1/1900的答案时,大约是6/6/1786(小数部分加减几个小时)。

于 2013-08-27T16:27:45.407 回答