【问题标题】:DateDiff in SQL Server asking for helpSQL Server 中的 DateDiff 寻求帮助
【发布时间】:2009-08-01 09:14:09
【问题描述】:

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

顺便说一句:CreateTime 列是过去的某个时间。

我花了相当长的时间从 MSDN 学习和搜索 DateDiff 的帮助,但无法弄清楚。谁能给我一个样品吗?

提前致谢, 乔治

【问题讨论】:

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


    【解决方案1】:

    您可以使用分钟选择和添加带有 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 分钟前),而第三个日期则更远。

    马克

    【讨论】:

    • 如果 CREATETIME 大于 getdateutc() 该值将为负数。应该是 -(3*24*60 + 30)
    • 那将是将来某个时间创建的行,对吗? :-) 对我来说听起来像是时光机……
    • 大家好,对不起,我没有让自己完全理解。 Createtime 已成为过去。我想我应该使用下面的 T-SQL,对吗? WHERE DATEADD(MINUTE, 4350, [CreationTime]) > GETUTCDATE()
    • 该示例对于所述问题是正确的。当第二个日期大于第一个日期时,DATEDIFF 产生一个正数。
    【解决方案2】:

    你需要DATEADD:

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

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

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

    (4350 是以分钟为单位的“3 天 30 分钟”)

    【讨论】:

    • 问题实际上指定了3天半小时,而不是1天。
    • 感谢 Richard,在您的 SQL 语句中,第一个参数 '.'是什么意思?
    • 感谢 Richard,我在您的代码中发现了两个问题。 :-) 1. SQL Server 2008 Enterprise 无法识别getdateutc,我需要使用GETUTCDATE; 2.我认为我应该使用 WHERE DATEADD(MINUTE, 4350, [CreationTime]) > GETUTCDATE(),而不是 WHERE DATEADD(MINUTE, 4350, GETUTCDATE())> [CreationTime],因为过去的时间总是更小?
    【解决方案3】:

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

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

    改编marc_s的答案:

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

    【讨论】: