【问题标题】:How do I convert an interval into a number of hours with postgres?如何使用 postgres 将时间间隔转换为小时数?
【发布时间】:2010-10-31 10:48:42
【问题描述】:

假设我有一个间隔

4 days 10:00:00

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

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

【问题讨论】:

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

标签: datetime postgresql intervals


【解决方案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】:

    如果你转换表格字段:

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

       CREATE TABLE IF NOT EXISTS test (
           ...
           field        INTERVAL SECOND(0)
       );
      
    2. 提取值。 记住转换为 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';
      

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

      【讨论】:

      • 不带区间值。
      猜你喜欢
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多