【问题标题】:DateDiff Rounding in SQL ServerSQL Server 中的 DateDiff 舍入
【发布时间】:2010-12-07 20:19:27
【问题描述】:

我有一个表,其中包含运行特定函数的最后日期/时间。在我的存储过程中,如果当前日期/时间距离上次运行时间超过一个小时,我想返回 1,如果小于它,我想返回 0。目前我有这个:

IF((SELECT TOP 1 DATEDIFF(HH,LastRunDateTime,GETDATE()) FROM myTable) >= 1)
BEGIN
    -- run statement to update LastRunDateTime
        return 1;
END
ELSE
    return 0;
END

如何使用 DateDiff 进行舍入?

如果超过一个小时,有没有更好的方法只返回 1?

【问题讨论】:

  • Exists 可能在这里有更好的表现,而且更直观

标签: sql sql-server tsql sql-server-2008 datediff


【解决方案1】:

用途:

SELECT CASE 
         WHEN DATEDIFF(hh, LastRunDateTime, GETDATE()) >= 1 THEN 1 
         ELSE 0 
       END

参考:

如何使用 DateDiff 进行舍入?

提供的文档链接中的 datepart Boundaries 部分列出了此类信息。

【讨论】:

    【解决方案2】:

    我想你想要

    IF DATEADD(hour, LastRunDateTime, 1) <= GETDATE() BEGIN
        RETURN 1;
    END;
    ELSE BEGIN
        RETURN 0;
    END;
    

    DateDiff 比仅仅减去两个日期时间要微妙一些。它实际上告诉您两者之间跨越了多少“边界”。例如:

    PRINT DATEDIFF(HH, '2010-12-07T03:59:59', '2010-12-07T04:00:00');
    PRINT DATEDIFF(HH, '2010-12-07T04:00:00', '2010-12-07T04:59:59');
    

    打印以下内容:

    1
    0
    

    这令人困惑,因为第二对日期时间相距较远。此功能在您需要时非常有用,但在您不需要时则违反直觉。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多