这个查询中发生了什么?

时间:2013-08-27 16:19:37

标签: sql sql-server

我想要获得最后一个月,并且为了我已经写了以下内容,来计算no。从今天到最后一次约会的日子。

    select datediff(DAY,GETDATE(),dateadd(m,1,getdate()))-GETDATE()
粗体部分给了我号码。从今天到今天之间的一天,例如30或31,然后我将从30或31减去今天的日期,这是" -getdate()"

上述查询的输出为

1786-06-06 11:44:30.540

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

感谢。 :)

2 个答案:

答案 0 :(得分:10)

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

31

将其转换为日期时间:

SELECT CONVERT(DATETIME, 31);

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

1900-02-01

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

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例如DATEDATETIME2等新数据类型失败。
  2. 请勿使用m之类的速记。如果您的意思是MONTH,那么只需要大幅提高工作效率并输入MONTH。要了解原因,请告诉我这是否能提供您期望的结果:

    SELECT DATEPART(y, GETDATE()), DATEPART(w, GETDATE());
    

答案 1 :(得分:2)

  

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

听起来你完全理解发生了什么,但也许不理解结果。

您隐含地将GETDATE()转换为数字,该数字代表自1/1/1900 12:00:00 AM以来的天数(和小时数)

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