我正在使用SQL Server 2008.我有一个表,其中包含一个名为CreateTime的日期时间类型列。我需要从这个表中选择CreateTime超过3天的所有记录,距离当前时间(UTC时间)半小时。我正在使用T-SQL存储过程。
BTW:CreateTime列是过去一段时间。
我花了很多时间来学习和搜索MSDN for DateDiff的帮助,但无法弄清楚。有人可以给我看样品吗?
提前谢谢, 乔治答案 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())