给定开始时间和持续时间,显示从分钟开始的每分钟的持续时间

时间:2017-06-23 15:02:59

标签: sql postgresql

背景 当操作员按下网页上的按钮时,我有几个硬件设备(控制器)被发送到这些设备。我们正在研究为什么有时沟通很慢。我设置了一个python自动脚本来刮擦页面并在三个独立的控制器上每分钟更改控制器模式。我记录了操作的开始和持续时间。

示例数据:

Id  Cont_id Start_time (pst)    Duration (sec)
316 11002   2017-06-22 20:05:13 5
317 6224    2017-06-22 20:05:38 15
319 7782    2017-06-22 20:06:20 15
318 11002   2017-06-22 20:06:20 5
320 6224    2017-06-22 20:06:56 15
321 11002   2017-06-22 20:07:27 5
336 7782    2017-06-22 20:07:38 500
322 6224    2017-06-22 20:08:14 15
323 11002   2017-06-22 20:08:36 5
324 6224    2017-06-22 20:09:32 10
325 11002   2017-06-22 20:09:43 10
326 6224    2017-06-22 20:10:44 10
327 11002   2017-06-22 20:10:55 10
328 6224    2017-06-22 20:11:56 5
329 11002   2017-06-22 20:12:07 15
330 6224    2017-06-22 20:13:03 10

期望的结果 我想要一个每分钟都有一个条目的报告,并告诉我每个控制器在当前操作中的时间。例如,考虑样本数据(控制器7782)中的时间~20:07。我想看到以下内容;

sample_time | cont_id | last_start_time | time_in_operation
20:08:00*   | 7782    | 20:07:38        | 22
20:08:00    | 11002   | 20:07:27        | 5 *
20:08:00    | 6224    | 20:06:56        | 15
20:09:00    | 7782    | 20:07:38        | 88
20:09:00    | 11002   | 20:08:36        | 5
20:09:00    | 6224    | 20:08:14        | 15
20:10:00    | 7882    | 20:07:38        | 148
....etc
  • 注1:我表示时间简洁 - 我实际上想要整个日期/时间 注2:这是5秒,因为操作已完成,所以使用      持续时间值。

问题:我最大的问题是每分钟都会出现一个模拟条目。一旦解决了,我想我可以得到其余的...所以,我如何编写一个查询,为我提供两个时间范围之间每分钟的条目,以我可以用来计算最终报告的方式编写根据样本数据。

设定:

CREATE TABLE public.operationtimelog (
    id int4 NOT NULL DEFAULT nextval('operationtimelog_id_seq'::regclass),
    controller_id int4 NOT NULL,
    op_start_time timestamp NOT NULL,
    op_duration int4 NOT NULL,
    CONSTRAINT operationtimelog_pkey PRIMARY KEY (id)
)
WITH (
    OIDS=FALSE
);

insert into
    operationtimelog (controller_id, op_start_time, op_duration) values
    (11002,  '2017-06-22 20:05:13', 5),
    (6224,   '2017-06-22 20:05:38', 15),
    (7782,   '2017-06-22 20:06:20', 15),
    (11002,  '2017-06-22 20:06:20', 5),
    (6224,   '2017-06-22 20:06:56', 15),
    (11002,  '2017-06-22 20:07:27', 5),
    (7782,   '2017-06-22 20:07:38', 500),
    (6224,   '2017-06-22 20:08:14', 15),
    (11002,  '2017-06-22 20:08:36', 5),
    (6224,   '2017-06-22 20:09:32', 10),
    (11002,  '2017-06-22 20:09:43', 10),
    (6224,   '2017-06-22 20:10:44', 10),
    (11002,  '2017-06-22 20:10:55', 10),
    (6224,   '2017-06-22 20:11:56', 5),
    (11002,  '2017-06-22 20:12:07', 15)

1 个答案:

答案 0 :(得分:1)

回答你的问题:给定两个时间戳生成一个表,其中包含它们之间每分钟的记录。

select time_column 
from generate_series(
  '2017-06-22 20:00:00'::TIMESTAMP, 
  '2017-06-22 20:09:00'::TIMESTAMP, 
  '1m'
) x(time_column)

输出:

     time_column
---------------------
 2017-06-22 20:00:00
 2017-06-22 20:01:00
 2017-06-22 20:02:00
 2017-06-22 20:03:00
 2017-06-22 20:04:00
 2017-06-22 20:05:00
 2017-06-22 20:06:00
 2017-06-22 20:07:00
 2017-06-22 20:08:00
 2017-06-22 20:09:00

然后,您可以使用LEFT JOIN将您的表/查询连接到该时间列,并从示例数据中截断op_start_time秒。

如何截断时间戳的秒数?

select date_trunc('m','2017-06-22 20:07:38'::timestamp)

输出:

     date_trunc
---------------------
 2017-06-22 20:07:00