【问题标题】:Querying data in 0-30 minute groups0-30分钟分组查询数据
【发布时间】:2014-10-28 17:45:34
【问题描述】:

我有一个每 30 分钟运行一次的脚本,它运行一个查询以查找前 30 分钟内的新记录。为了解决脚本运行的任何类型的延迟,我想查看之前的 0:00-30:00 分钟和 30:01-59:59 块。

例如,如果我的脚本在上午 11:00 运行,我希望它能够找到具有

的新行

entered_date > 10:30 am AND < 11:00 am

当它在上午 11:30 运行时,我希望从 `entered_date > 11:00am AND

做这样的事情只会得到最后运行 30 分钟:

SELECT
    fa.entered_date,
    fa.text
FROM
    form_answers fa 
WHERE
    AND fa.value = 1
    AND fa.entered_date >= DATEADD(mi, -30, GETDATE())

因此,如果我的脚本以某种方式延迟了几秒钟,并在 11:00:02 运行,我可能会错过 entered_date 为 10:30:01 的记录。

编辑:

这就是最终对我有用的东西:

    fa.entered_date BETWEEN 
        DATEADD(mi,-30,CONVERT(VARCHAR(19),DATEADD(mi, DATEDIFF(mi, 0, GETDATE())/30*30, 0))) 
    AND 
        DATEADD(mi, DATEDIFF(mi, 0, GETDATE())/30*30, 0)

【问题讨论】:

    标签: sql sql-server sql-server-2008-r2 datediff dateadd


    【解决方案1】:

    在脚本中依赖时钟时间是个坏主意。您的脚本可能由于其他原因无法运行——例如,SQL Server 代理没有运行,或者服务器在运行时重新启动,或者新人不小心取消了选中的复选框。或者,它可能会在某个时间段内运行两次。

    如果您想要稳健性,请保留上次运行脚本的日志表。然后从日志中读取,类似于:

    select @lastlogtime = max(lastreadtime)
    from log;
    

    并在您的查询中使用它而不是依赖时钟。

    【讨论】:

    • 我 100% 同意使用时钟时间是一个可怕的想法。我宁愿跟踪脚本何时运行,但是,我无法将数据插入到这个特定的数据库中。只需查询。
    • @etm124 。 . .在这种情况下,也许您应该为此类表获取自己的数据库(它可以是不同的数据库)。这似乎是一个奇怪的结构,您可以在其中运行作业但在服务器上的任何位置都没有写入权限。作为最后的手段,您可以将此类信息保存在文件中,但在运行数据库作业时这是不正当的。
    【解决方案2】:

    仅根据时间处理“新”记录并没有万无一失的方法 - 即使您跟踪“最后”处理时间,也可能有记录丢失,或者记录被处理两次。

    一些替代方法:

    • 跟踪最后处理的entered_date 并处理在那之后添加的任何内容。
    • 跟踪最后处理的 ID,并处理任何具有更高 ID 的记录(假设您的表使用递增键)。
    • 在您的记录中添加标志或状态字段,以了解它们是否已被处理
    • 使用在添加记录(使用触发器)并定期处理时填充的队列。

    如果您确实必须仅依靠时钟,那么我会将“当前”时间四舍五入到最接近的 30 分钟间隔,然后从 那里锁定 30 分钟。所以如果当前时间是11:00:02,它会将它四舍五入到11:00:00,并处理在10:30:0011:00:00之间添加的记录。

    【讨论】:

    • 我同意您和 Gordon 关于不同跟踪方法的建议。但是,我不能将数据插入这个特定的数据库,只能查询数据。它真的只让我使用时钟方法。您能否提供一个将“当前”时间四舍五入到最接近的示例,然后从四舍五入的时间回顾 30 分钟?
    • 根据您的建议,我认为这样的事情可能会奏效:pastebin.com/SBeZTwKw
    猜你喜欢
    • 2021-10-25
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2019-09-28
    • 2013-09-16
    • 2020-03-03
    • 1970-01-01
    • 2019-04-12
    相关资源
    最近更新 更多