【问题标题】:How do I check whether the time has reached the next half hour in SQL?SQL如何检查时间是否到了下一个半小时?
【发布时间】:2013-12-17 07:18:20
【问题描述】:

我知道,令人困惑的标题。让我解释一下:

我有一份包含多个步骤的工作。

作业每 15 分钟运行一次。

作业中的一个步骤是运行检查(存储过程)以查看在该存储过程中创建的临时表中是否有记录。

如果有记录,我想发邮件。

电子邮件只能在上午 7 点到下午 4 点之间发送,并且每 30 分钟重复一次。

现在,我知道如何检查某事是否存在以及是否在正确的时间范围内:

IF (EXISTS ( SELECT 1
                         FROM   @NewItems
                         WHERE  DATEPART(HOUR, GETDATE()) BETWEEN 7 AND 16 ))
               BEGIN
                   -- send email
               END

所以我的问题是,我该如何进行上述检查并且是下一个半小时?

例如,我想在上午 7 点、上午 7 点 30 分、上午 8 点、上午 8 点 30 分等到 16:00(或下午 4 点)发送这封电子邮件。

我该怎么做呢?

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

    您可以使用审核表来跟踪您发送的电子邮件。比如:

    CREATE TABLE EMAIL_AUDIT_TRAIL
    (
        EMAIL_SEND_TIME AS DATETIME NOT NULL,
        EMAIL_SUMMARY AS VARCHAR(100)
    )
    

    这样做的一个好处是,您可以在服务器端获得一些可追溯性,以了解电子邮件的发送时间,并且可能是他们所说内容的简短摘要(例如项目数量或其他)。

    每次存储过程运行时,您可以使用类似CAST(FLOOR(CAST(GETDATE() as FLOAT(53))*48)/(48) AS DATETIME)(改编自问题T-SQL: Round to nearest 15 minute interval 的答案)将当前时间四舍五入到最后 30 分钟的间隔,然后检查该间隔是否有审计表中的一个条目。

    如果没有,请发送电子邮件(并将适当的条目添加到审核表中)。

    您甚至可以使用相同的方法通过检查当前时间(四舍五入到最接近的 30 分钟)是否包含在包含一天中所有时间的表中来确定间隔是否应该发送电子邮件应该发送电子邮件(所以在你的情况下,7:00 到 16:00 之间的所有 30 分钟间隔)。

    显然,您必须对审计表进行一些清理,以确保它也不会永远增长。

    【讨论】:

      猜你喜欢
      • 2015-01-03
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多