如何检查SQL中的时间是否到达下一个半小时?

时间:2013-12-16 22:47:38

标签: sql tsql

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

我的工作有多个步骤。

这项工作每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点半等发送此电子邮件,直到16:00(或下午4点)。

我将如何做到这一点?

1 个答案:

答案 0 :(得分: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分钟)是否包含在包含白天所有时间的表格中来确定是否应该发送电子邮件的时间间隔应该发送电子邮件(所以在你的情况下,所有30分钟的间隔在7:00到16:00之间)。

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