2009-08-01 45 views
0

我正在使用SQL Server 2008.我有一个表,它有一个名为CreateTime的日期时间类型列。我需要从该表中选择所有记录的CreateTime超过3天,从当前时间(UTC时间)起半小时。我正在使用T-SQL存储过程。SQL Server中的DateDiff寻求帮助

顺便说一句:CreateTime列是过去一段时间。

我花了相当多的时间学习和搜索DateDiff的MSDN帮助,但无法弄清楚。任何人都可以给我看一个样品吗?

由于事先 乔治

回答

5

您可以选择和使用分钟,并DATEDIFF添加一个WHERE子句:

SELECT (fields) 
FROM (table) 
WHERE 
    DATEDIFF(MINUTE, CREATETIME, getutcdate()) <= (3*24*60 + 30) 

当然,如果你只想要那些行更多超过3天,30分钟的路程,只需使用相反:

WHERE 
    DATEDIFF(MINUTE, CREATETIME, getutcdate()) > (3*24*60 + 30) 

样品:

SELECT  
    DATEDIFF(MINUTE, '2009-08-01 08:00:00', getutcdate()), 
    DATEDIFF(MINUTE, '2009-07-31 20:00:00', getutcdate()), 
    DATEDIFF(MINUTE, '2009-07-23 20:00:00', getutcdate()) 

给出作为结果:

96 816 12337 

所以前两个日期仍然在4350分钟的括号内(小于3天和30分钟前),而第三次日期更远。

马克

3

您需要DATEADD

WHERE DATEADD(minute, 4350, CreateTime) <= getutcdate() 

或者,正如你所说,你可以使用DATEDIFF

WHERE DATEDIFF(minute, CreateTime, getutcdate()) <= 4350 

(4350是“3天30分钟)

+1

这个问题实际上是规定了3天,一个半小时,而不是1天。 – Amber 2009-08-01 09:19:37

+1

被抓住了。更新。 – 2009-08-01 09:21:40

2

一个小问题给定答案,虽然他们是正确的。不要将函数应用于列:将函数应用于比较值。

如果CREATETIME被索引,那么它是扫描而不是使用列上的函数进行查找。 您不需要数百万行来解决这个问题。

适应marc_s的答案:

SELECT (fields) 
FROM (table) 
WHERE 
    CREATETIME <= DATEADD(MINUTE, - (3*24*60 + 30), getutcdate())