首页 > 解决方案 > 关于查找包含在某个纪元时间范围内的记录的 SQL 查询的建议

问题描述

为那些需要较少抽象的人编辑了一个“CREATE TABLE”脚本(见问题底部)

运行一个水管理报警系统,其中硬件运行一个包含开始/停止时间的预定计时器“程序”,每个程序可以运行一个或多个“站”(阀门或洒水器或其他任何东西),它们按照自己的开始/停止时间运行由“程序”控制。请参阅下面的块以获取粗略示例,然后进行解释。

|<---- Program 1 ----------------------------------------------->|
|<-- Station 1 -->|   |<---- Station 2 ---->|<---- Station 3 --->|

|<---- Program 2 ---------------------------------------->|
          |<---- Station 4 ---->|<---- Station 5 -->|

|<---- Program 3 --->|
|<---- Station 6 -->|

                                |<-- Master Pump Fail Alarm -->|

在上面的“伪时间表”中,程序 1 有 3 个站点正在运行,程序 2 有 2 个站点正在运行。节目 3 有一个车站。主泵恰好在程序 2 中的第 5 站启动时发生故障,但警报在程序 2 结束后结束(可能已修复?)但仍在程序 1 的运行时间内。箭头指示事件运行时间的开始和停止时间以及范围.

基本上,我试图找出一个 WHERE 子句算法,如下所示:

SELECT stuff WHERE "a program's or station's running time occurred *during* the alarm period (alarm.begintime to alarm.endtime in the schema below)".  

使用上述示例时间表的结果应返回一个记录列表,其中包括带有站点 2 和 3 的程序 1,以及仅带有站点 5 的程序 2。

程序、站点和警报的开始和结束时间记录在 EPOCH/UNIXTIME 的数据库中。数据库引擎是 x86_64-pc-linux-gnu 上的 PostgreSQL 9.6.5。

如果有什么需要进一步澄清,请询问。提前感谢您提供帮助解决问题的任何花絮。

下面的模式应该创建与上面的可视化块类似的布局:

CREATE TABLE test(
 oid PRIMARY KEY,
 itemid INTEGER,
 itemtype VARCHAR (255),
 begintime INTEGER,
 endtime INTEGER
);

INSERT INTO test VALUES (1, 1, 'Program', 1556809522, 1556809680);
INSERT INTO test VALUES (2, 1, 'Station', 1556809522, 1556809560);
INSERT INTO test VALUES (3, 2, 'Station', 1556809620, 1556809642);
INSERT INTO test VALUES (4, 3, 'Station', 1556809642, 1556809680);

INSERT INTO test VALUES (5, 2, 'Program', 1556809522, 1556809670);
INSERT INTO test VALUES (6, 4, 'Station', 1556809541, 1556809630);
INSERT INTO test VALUES (7, 5, 'Station', 1556809630, 1556809660);

INSERT INTO test VALUES (8, 3, 'Program', 1556809522, 1556809618);
INSERT INTO test VALUES (9, 6, 'Station', 1556809522, 1556809617);

INSERT INTO test VALUES (10, 1, 'Alarm', 1556809630, 1556809675);

标签: sqltimestampwhere-clauseepochpostgresql-9.5

解决方案


推荐阅读