Postgres范围在时间戳之间选择

时间:2019-01-07 14:18:05

标签: postgresql

有两个时间戳,结果以分钟为单位,可以说320分钟,我需要计算完整小时数,可以说我们这里有5h和20分钟,我需要在分钟列中插入6行(5行,其中60分钟为分钟)专栏,最后20分钟)

在Postgres,某些循环或尝试使用cte选择数字的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

demo:db<>fiddle

WITH timestamps AS (
    SELECT '2019-01-07 03:30:00'::timestamp as ts1, '2019-01-07 08:50:00'::timestamp as ts2
)

SELECT 60 as minutes
FROM timestamps, generate_series(1, date_part('hour', ts2 - ts1)::int)

UNION ALL

SELECT date_part('minute', ts2 - ts1)::int
FROM timestamps
  1. date_part从时间戳记差异中提取hour(或minute)值。
  2. 通过generate_series函数,我生成的n行的值为60n = hours
  3. UNION ALL
  4. 添加剩余的分钟数

编辑:1天以上:

使用date_part代替EXTRACT(EPOCH FROM ...),以秒为单位。

WITH timestamps AS (
    SELECT '2019-01-06 03:30:00'::timestamp as ts1, '2019-01-07 08:50:00'::timestamp as ts2
)

SELECT 60 as minutes
FROM timestamps, generate_series(1, (EXTRACT(EPOCH FROM ts2 - ts1) / 60 / 60)::int)

UNION ALL

SELECT (EXTRACT(EPOCH FROM ts2 - ts1) / 60)::int % 60
FROM timestamps
  1. 使用/ 60 / 60将秒数转换为小时数
  2. / 60 % 60计算剩余的秒数(第一步为您提供分钟,模运算符%为您提供剩余的小时数)