邮政编码范围在时间戳之间进行选择



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

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

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 函数,我正在生成值为 60n = hours ) 的n
  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计算剩余秒数(第一步给你分钟,取模运算符%给你剩余的分钟到小时)

最新更新