Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用Postgres查询将时间划分为块_Sql_Postgresql - Fatal编程技术网

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

Sql 使用Postgres查询将时间划分为块,sql,postgresql,Sql,Postgresql,这里我有两个时间 开始时间、结束时间和间隔,我的输出应该是 输入: 开始时间:上午10:00 完整时间:下午六时 间隔时间:10分钟 我的输出应该如下 10:00 AM 10:10 AM 10:20 AM .... 5:50 PM 6:00 PM 使用postgres查询您可以使用generate_series()进行查询。不幸的是,它不支持直接生成一系列时间值。因此,您需要生成一系列要添加的“分钟数”。为此,您需要计算开始和结束时间之间的分钟数,并将其用于generate_series(

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

输入:

  • 开始时间:上午10:00
  • 完整时间:下午六时
  • 间隔时间:10分钟
我的输出应该如下

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

使用postgres查询

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

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

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

在线示例:


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


在线示例:

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

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

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

在线示例:


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


在线示例:

@Zack,是的,这是真的-但我假设使用时间戳,然后丢弃其中的日期部分,对于从未使用过
generate_series()
@Zack,是的,这是真的-但我假设使用时间戳,然后丢弃其中的日期部分,对于从未使用过
generate\u 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);
select gs.ts::time
from generate_series(current_date + time '10:00', 
                     current_date + time '18:00', 
                     interval '10' minute) as gs(ts);