首页 > 解决方案 > Postgres在时间戳之间选择范围

问题描述

有两个时间戳,并导致它们之间的分钟让我们说 320 分钟我需要计算完整的小时,假设我们这里有 5 小时和 20 分钟,我需要插入 6 行和分钟列(5 行,60 作为分钟列和最后一个20分钟)

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

标签: postgresql

解决方案


演示:db<>小提琴

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具有值60( n = hours)的行
  3. 添加剩余的分钟数UNION ALL

编辑:超过 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(第一步给你分钟,模运算符%给你剩余的分钟到小时)

推荐阅读