目前我必须基于查询进行报告,所做的查询必须每五分钟返回一次在某个日期范围内发生的所有停止,如果有记录满足该时间间隔的此条件,则应返回 1 ,如果没有记录,它应该返回0。为了更容易解释,我放了一张示例表的图片:(*它不允许上传图片,所以我在下面放了一个链接) 示例表的图片 什么我需要的是,在查询之后,我在 00:00 - 00:05, 00:05 - 00:10, .... 的时间间隔内返回 0,对于 06:05 - 06:10 它返回 1,依此类推这个逻辑是某些日期之间的所有间隔。
为此,我找到了一些帮助:
select variable,
convert(varchar(8), tiempo, 1)+' '
+convert(varchar(2), datepart(hh, tiempo))+':'
+convert(varchar(2), datepart(mi, tiempo)/5),
count(*)
from datos group by
variable,
convert(varchar(8), tiempo, 1)+' '
+convert(varchar(2), datepart(hh, tiempo))+':'
+convert(varchar(2), datepart(mi, tiempo)/5)
问题是这段代码确实向我显示了有记录的间隔,但没有显示那些不存在的记录。我正在处理 MSSQL Server 2012 Greetings。
这是一个相当反复出现的问题,即在没有记录的情况下生成记录。在您的情况下,您需要提前设置时间段以确定其中是否有读数。正如您所提到的,您最多工作 24 小时,即 288 (26 * 60 / 5) 个周期,使用我提出的解决方案是可行的,它基于生成时间间隔的动态表从日期首字母开始。有了这个表,我们可以做一个
LEFT JOIN
,datos
如果没有记录,我们会将数量计为 0。让我们来看看:
第一部分没有太多神秘之处,我们创建了一个变量类型表,(它也可能是一个临时表)作为您的表的示例以及
datos
我们将调用的新表Intervalos
。然后我们设置一个变量的值,该变量@PrimerIntervalo
代表我们将从哪里查询datos
。例如,SELECT @PrimerIntervalo = '20170807 09:30:00 am'
我们的咨询将于 7 月 8 日 9:30 开始。然后我们完成
Intervalos
了一种可能的方法来生成可以在 SQL Server 中使用的序列或间隔,在性能方面有更好的方法,但我向您展示的方法很容易理解,它们大约是CROSS JOINS
三个表,有 10 个每条记录什么 它将允许我们生成一个包含 1000 条记录 (10 x 10 x 10) 的表,编号从 1 到 1000,其中我们将只使用 288 来生成间隔。如果您想深入了解该主题,我建议您阅读这篇关于如何在 SQL Server 中生成序列的优秀文章。为了完成这个阶段,我们只需将 5 分钟添加到
@PrimerIntervalo
by date 来生成 From / To 字段Nro
,Intervalos
这将给我们留下如下内容:这已经为我们提供了最终要做什么的指导方针:“交叉”这些时期/间隔,
datos
如果我们没有记录,我们将其计为 0。最后是这个查询:
它检查您在请求的 24 小时内拥有的每个不同的变量,并且对于 288 个时间间隔中的每一个,输出如下所示:
如果我理解正确的话,你应该画一天5分钟的所有范围(根据你说的应该是288行),根据数据表中是否有值,它会画一个0 还是 1 对吗?
如果是这样,我认为它不能仅通过查询来完成。由于您无法绘制表中不存在的值,因此您应该有一个
for
或一些控制结构来迭代一天有 5 分钟的 288 个范围,如果表中有值,则在每一轮中进行查询知道绘制 1 还是 0为此,您必须使用程序,我在此看到的不好的部分是您必须启动 288 个查询(每个范围一个),这可能会使数据库有点过载。