SQL添加两个日期变量(日期+日期)

时间:2016-04-04 08:34:24

标签: sql sql-server tsql

检查以下脚本

SELECT getdate() CurrentDate,getdate()+getdate() NewDate

结果是:

CurrentDate             NewDate
2016-04-04 13:57:51.713 2132-07-08 03:55:43.427

我的问题是,为什么年份是2132年,而月份是07年新日期字段。

3 个答案:

答案 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 )

将x天添加到日期

答案 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;