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

Posted

技术标签:

【中文标题】如何使用 postgres 将时间间隔转换为小时数?【英文标题】:How do I convert an interval into a number of hours with postgres? 【发布时间】:2009-06-04 19:08:19 【问题描述】:

假设我有一个间隔

4 days 10:00:00

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

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

【问题讨论】:

注意:如果您的时间间隔包含月或年,则没有明确的答案来确定有多少小时,因为一个月或一年中的天数会有所不同。所以要小心! @Teddy:更准确地说,有多个定义的答案;) 【参考方案1】:

可能最简单的方法是:

SELECT EXTRACT(epoch FROM my_interval)/3600

【讨论】:

如果间隔包含分钟和/或秒,则可能会将结果取整或转换为整数 提取纪元?哦,天哪,一百万年后我都不会想到。 SELECT EXTRACT(epoch FROM my_interval/3600)(interval 具有原生的“除整数”支持,结果是间隔,提取结果是整数,而不是浮点数)。所以。自动投射/地板完成。 警告:简单地提取 epoch 隐含假设一个月 = 30 天,一年 = 365.25 天。 @Teddy 我们能用它做什么?如何避免这个问题并获得真实的纪元数?【参考方案2】:

如果你想要整数,即天数:

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 警告:简单地提取 epoch 隐含假设一个月 = 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;

【讨论】:

如果你的区间是'1 month 0 days',使用extract(day from …)会得到0作为结果。【参考方案4】:
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

【讨论】:

【参考方案5】:

如果你转换表格字段:

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

     CREATE TABLE IF NOT EXISTS test (
         ...
         field        INTERVAL SECOND(0)
     );
    

    提取值。 记住转换为 int 否则,一旦间隔很大,您可能会得到一个令人不快的惊喜:

    EXTRACT(EPOCH FROM field)::int

【讨论】:

我认为 Redshift 不支持 INTERVAL 数据类型。它只是 BIGINT。【参考方案6】:

我正在使用 PostgreSQL 11,我创建了一个函数来获取 2 个不同时间戳之间的小时数

create function analysis.calcHours(datetime1 timestamp, datetime2 timestamp)
    returns integer
    language plpgsql as $$
    declare
        diff interval;
    begin
        diff = datetime2 - datetime1;
        return (abs(extract(days from diff))*24 + abs(extract(hours from diff)))::integer;
    end; $$;

【讨论】:

【参考方案7】:
         select date 'now()' - date '1955-12-15';

这是计算总天数的简单查询。

【讨论】:

不带区间值。

以上是关于如何使用 postgres 将时间间隔转换为小时数?的主要内容,如果未能解决你的问题,请参考以下文章

在 Postgres 中分组为 2 小时的间隔

将小时间隔转换为 24 小时间隔

将时间间隔从文本转换为数字并按客户时间间隔分组

绘图时间与角度;如何将时间转换为数字

如何将本地通知重复间隔设置为自定义时间间隔?

postgres - 日期时间自动转换