我想要获得最后一个月,并且为了我已经写了以下内容,来计算no。从今天到最后一次约会的日子。
select datediff(DAY,GETDATE(),dateadd(m,1,getdate()))-GETDATE()
粗体部分给了我号码。从今天到今天之间的一天,例如30或31,然后我将从30或31减去今天的日期,这是" -getdate()"
上述查询的输出为
1786-06-06 11:44:30.540
您能解释一下查询中发生了什么吗?我不是在寻找解决方案,我想知道SQL-Server如何解释查询。
感谢。 :)
答案 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()));
现在,我强烈推荐几件事:
@date_var_or_col - 1
例如DATE
和DATETIME2
等新数据类型失败。请勿使用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
(小数部分加上或减去几个小时)。