检查以下脚本
SELECT getdate() CurrentDate,getdate()+getdate() NewDate
结果是:
CurrentDate NewDate
2016-04-04 13:57:51.713 2132-07-08 03:55:43.427
我的问题是,为什么年份是2132年,而月份是07年新日期字段。
答案 0 :(得分:11)
1900-01-01
是日期0
SELECT CONVERT(datetime, 0)
当你一起添加2个日期时,它会隐式转换为整数,执行添加然后转换回日期时间
SELECT CONVERT(INT, getdate()), -- no of days since 1900-01-01
CONVERT(INT, getdate()) + CONVERT(INT, getdate()),
CONVERT(DATETIME, CONVERT(INT, getdate()) + CONVERT(INT, getdate()))
添加2个日期是不合逻辑的。但您宁愿使用dateadd( day , x, a_date )
答案 1 :(得分:0)
如果要为日期变量添加一些时间间隔,则应使用DATEADD函数。
SELECT GETDATE() AS CurrentDate, DATEADD(month, 1, GETDATE()) AS NewDate
请注意,您还可以使用负值从给定日期中减去一些时间间隔。有关此功能用法的更多信息,请访问:https://technet.microsoft.com/pl-pl/library/ms186819(v=sql.110).aspx
答案 2 :(得分:0)
由于您的日期将减少到几秒钟,您应该 - 在学校学到这一点:-) - 转到最小的单位,在那里做数学然后 - 如果需要 - 回到您想要使用的任何格式用于显示。
以下将计算两个DATETIME值之间的差异。
如果您的经过时间确实是DATETIME,那么您必须意识到,当这超过24小时或它们的总和时,您会遇到麻烦。您应该将列类型更改为INT并存储经过的秒数。这更接近真实的含义,更容易处理。
但是 - 给你一个提示 - 这是用日期时间值计算的一种方法:
CREATE TABLE #test(Elapsed1 DATETIME, Elapsed2 DATETIME);
INSERT INTO #test VALUES
( {d'2000-01-01'},DATEADD(DAY,3,{d'2000-01-01'})) --3 full days
,(GETDATE(),DATEADD(SECOND,180,GETDATE())) --3 minutes
--this would be your table of datetime values
SELECT Elapsed1
,Elapsed2
,DATEDIFF(SECOND,{d'2000-01-01'},Elapsed2) AS Elapsed1Seconds
,DATEDIFF(SECOND,{d'2000-01-01'},Elapsed2) AS Elapsed2Seconds
,DATEDIFF(SECOND,{d'2000-01-01'},Elapsed2)
-DATEDIFF(SECOND,{d'2000-01-01'},Elapsed1) AS DifferenceSeconds
,DATEADD(SECOND,DATEDIFF(SECOND,{d'2000-01-01'},Elapsed2)
-DATEDIFF(SECOND,{d'2000-01-01'},Elapsed1),{d'2000-01-01'}) AS AddedTimespans
FROM #test;
DROP TABLE #test;