如何使用postgres将时间间隔转换为小时数?


161

说我有一个间隔

4 days 10:00:00

在postgres中。如何将其转换为小时数(在这种情况下为106小时?)是否有功能或我应该硬着头皮做类似的事情?

extract(days, my_interval) * 24 + extract(hours, my_interval)

9
注意:如果您的间隔包含几个月或几年,则由于一个月或一年中的天数会有所不同,因此没有明确定义多少小时的答案。所以要当心!
泰迪

Answers:


313

可能最简单的方法是:

SELECT EXTRACT(epoch FROM my_interval)/3600

6
如果间隔包含分钟和/或秒,则可能将结果取整或将其转换为整数
rasjani

64
提取时代?噢,我的,那在一百万年之内我就不会想过。
09年

4
SELECT EXTRACT(epoch from my_interval / 3600)(间隔具有本机“除整数”支持,结果是间隔,提取结果是整数,而不是浮点数)。所以。自动播报/已完成。
Offenso

19
警告:简单地提取历元就隐含地假设一个月= 30天,一年= 365.25天。
泰迪

@Teddy我们能用它做什么?如何避免这个问题并获得真实的时期?
Asmox

18

如果要整数,即天数:

SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int

大!谢谢:)但是,我发现我们现在可以将其修改为SELECT extract('epoch' FROM age('2014-08-02'::timestamp)) / 86400(我正在使用Pg 9.4),因为只有一个参数时才age(ts)自动使用CURRENT_DATE
1111161171159459134

7
警告:简单地提取历元就隐含地假设一个月= 30天,一年= 365.25天。
泰迪

3

要获得天数,最简单的方法是:

SELECT EXTRACT(DAY FROM NOW() - '2014-08-02 08:10:56');

据我所知它将返回与:

SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int;

27
如果您的时间间隔为'1 month 0 days',则使用extract(day from …)将得到0结果。
Underyx

1
select floor((date_part('epoch', order_time - '2016-09-05 00:00:00') / 3600)), count(*)
from od_a_week
group by floor((date_part('epoch', order_time - '2016-09-05 00:00:00') / 3600));

::int转换遵循四舍五入的原则。如果需要不同的结果(例如四舍五入),则可以使用相应的数学函数,例如floor


1

如果转换表字段:

  1. 定义字段,使其包含秒数:

     CREATE TABLE IF NOT EXISTS test (
         ...
         field        INTERVAL SECOND(0)
     );
  2. 提取值。请记住,以其他方式强制转换为int,一旦间隔很大,您会得到不愉快的惊喜:

    EXTRACT(EPOCH FROM field)::int


我不认为Redshift支持INTERVAL数据类型。那只是BIGINT。
matt2000

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.