查询0-30分钟群组中的数据
我有一个脚本,每30分钟运行一次查询,查询前30分钟内的新记录。为了说明脚本运行的任何类型的延迟,我想看看前面的0:00-30:00分钟和30:01-59:59大块。查询0-30分钟群组中的数据
例如,如果我的脚本在上午11点运行,我希望它发现有一个
entered_date > 10:30 am AND < 11:00 am
而当它运行在上午11:30,我期望新行从'entered_date> 11:00 am和< 11:30 am新行。
做这样的事情只得到最后的跑步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)
即使您追踪“最后”处理时间,可能有错过的记录或两次处理过的记录,但没有确切的方法可以仅基于时间来处理“新”记录。
一些替代方法:
- 跟踪所处理的最后一个
entered_date
和过程,是在该时间之后加入任何东西。 - 跟踪处理的最后一个ID,并处理具有较高ID的任何记录(假设您的表使用递增键)。
- 添加标志或状态字段到您的记录,以确定它们是否已被处理
- 使用添加记录(使用触发器)并定期处理时填充的队列。
如果DO有单独依靠时钟,那么我会圆“当前”时间到最近的30分钟间隔,并锁定回从有 30分钟。因此,如果当前时间为11:00:02
,则会将其舍入到11:00:00
,并处理在10:30:00
和11:00:00
之间添加的记录。
这是一个评论太长。
根据脚本中的时钟时间是个坏主意。您的脚本可能因其他原因而无法运行 - 例如,SQL Server代理程序未运行,或者服务器在运行时重新启动,或者新用户意外取消选中某个框。或者,它可能会在一段时间内运行两次。
如果你想要健壮性,那么保留上次脚本运行的日志表。再从日志中读取,这样的:
select @lastlogtime = max(lastreadtime)
from log;
而在你的查询,而不是依靠时钟使用。
我100%同意使用时钟是一个可怕的想法。我宁愿跟踪脚本何时运行,但是,我无法将数据插入到特定数据库中。只是查询。 – etm124 2014-10-28 17:51:42
@ etm124。 。 。也许你应该为这样的表获得自己的数据库,在这种情况下(它可以是一个不同的数据库)。这似乎是一个奇怪的结构,您可以运行一个作业,但没有在服务器上的任何地方写入权限。作为最后的手段,您可以将这些信息保存在一个文件中,但在运行数据库作业时这是不正确的。 – 2014-10-28 17:52:42
我同意你和Gordon关于不同跟踪方法的建议。但是,我无法将数据插入到此特定数据库中,只能查询数据。它只是让我使用时钟方法。你能提供一个将“当前”时间四舍五入到最近的例子,然后回顾30分钟的时间吗? – etm124 2014-10-28 18:08:17
随着你的建议,我认为这样的事情可以工作:http://pastebin.com/SBeZTwKw – etm124 2014-10-28 18:19:10