使用Postgres查询将时间划分为块

时间:2018-10-15 13:17:08

标签: sql postgresql

我这里有两个时间 开始时间,结束时间和间隔,我的输出应该类似于

输入:

  • 开始时间:10:00 AM
  • 结束时间:6:00 PM
  • 间隔:10分钟

我的输出应该如下

10:00 AM
10:10 AM
10:20 AM
....
5:50 PM
6:00 PM

使用postgres查询

1 个答案:

答案 0 :(得分:4)

您可以使用generate_series()。不幸的是,它不支持直接生成一系列time值。因此,您需要生成一系列要添加的“分钟数”。为此,您需要计算开始时间和结束时间之间的分钟数,并将其用于generate_series()

select time '10:00' + interval '1' minute * gs.minutes 
from generate_series(0, 
                     (extract(epoch from time '18:00' - time '10:00') / 60)::int,
                     10) as gs(minutes);

表达式extract(epoch from time '18:00' - time '10:00') / 60计算开始时间和结束时间之间的分钟数,并将其作为要生成的值的上限(将其强制转换为整数以使generate_series()满意)。第三个参数10指定以10为增量生成数字。然后将其与1分钟长度的间隔相乘并添加到起始值。

请注意,这样编写的时间文字使用标准的ISO 24小时表示法,而不是AM / PM表示法。但是您可以根据需要使用to_char()格式化输出。但是您最好在应用程序中格式化它,而不是在SQL中格式化。

在线示例:https://rextester.com/XUJ25540


另一种方法是使用生成时间戳的generate_series()版本,并将结果转换为time值(丢弃日期部分):

select gs.ts::time
from generate_series(current_date + time '10:00', 
                     current_date + time '18:00', 
                     interval '10' minute) as gs(ts);

在线示例:https://rextester.com/YRNAW81361