使用Postgres的每第n个时间间隔的数据

时间:2015-12-31 12:34:02

标签: sql postgresql

我在开始日期和结束日期之间过滤我的数据。 我想要做的是我想在'31 -12-2015 11:19:00'和'31 -12-2015 11:25:00'之间以'2'分钟间隔过滤数据

CREATE TABLE table_1
(
  timestamp_col timestamp without time zone,
  value_col integer
);

INSERT INTO table_1(
        timestamp_col, value_col)
VALUES ('2015-12-31 11:19:10', 10),('2015-12-31 11:20:10', 23),
('2015-12-31 11:21:10', 32),('2015-12-31 11:22:10', 43),
('2015-12-31 11:23:10', 55),('2015-12-31 11:24:10', 32),('2015-12-31 11:25:10', 100)
;

这是我正在使用的查询,但没有按要求获得结果

SELECT timestamp_col, value_col
  FROM table_1
  Where timestamp_col Between '31-12-2015 11:00:00' AND '31-12-2015 12:00:00'
  AND date_part('minutes',timestamp_col)::int % 2 = 0

这是“2015-12-31 11:20:10”的结果数据,但我希望它从“2015-12-31 11:19:10”开始,“2015-12-31 11:21: 10“......< 2分钟从开始日期到结束日期之间的开始时间戳的间隔>

1 个答案:

答案 0 :(得分:0)

评论太长了。

首先,使用ISO标准日期格式:YYYY-MM-DD:

SELECT timestamp_col, value_col
FROM table_1
WHERE timestamp_col Between '2015-12-31 11:00:00' AND '2015-12-31 12:00:00' AND
      date_part('minutes', timestamp_col)::int % 2 = 0;
------^

这不会影响您的结果。但第二个条件是将结果限制为偶数分钟。因此,你不能得到11:19,因为“19”是奇数。

如果您想要基于第一个时间戳的奇偶校验,您可以计算最小时间戳并比较:

SELECT timestamp_col, value_col
FROM (SELECT t1.*, MIN(timestamp_col) OVER () as mintc
      FROM table_1 t1
     ) t1
Where timestamp_col Between '2015-12-31 11:00:00' AND '2015-12-31 12:00:00' AND
      date_part('minutes', timestamp_col)::int % 2 = date_part('minutes', mintc)::int % 2;