SQL Server中的DateDiff请求帮助

时间:2009-08-01 09:14:09

标签: sql sql-server tsql sql-server-2008 stored-procedures

我正在使用SQL Server 2008.我有一个表,其中包含一个名为CreateTime的日期时间类型列。我需要从这个表中选择CreateTime超过3天的所有记录,距离当前时间(UTC时间)半小时。我正在使用T-SQL存储过程。

BTW:CreateTime列是过去一段时间。

我花了很多时间来学习和搜索MSDN for DateDiff的帮助,但无法弄清楚。有人可以给我看样品吗?

提前谢谢, 乔治

3 个答案:

答案 0 :(得分:5)

您可以使用分钟选择并添加带有DATEDIFF的WHERE子句:

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

当然,如果您只想要那些 MORE 超过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分钟前),而第三个日期更远。

马克

答案 1 :(得分:3)

您需要DATEADD

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

或者,正如您所提到的,您可以使用DATEDIFF

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

(4350分钟为“3天30分钟”)

答案 2 :(得分:2)

一个小答案,给出了答案,尽管它们是正确的。不要将该函数应用于列:将函数应用于比较值。

如果CREATETIME被编入索引,则它是扫描而不是使用列上的函数进行搜索。 您不需要数百万行就可以解决这个问题。

调整marc_s的答案:

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