Datetime 我如何将一个时间间隔转换为postgres的小时数?

Datetime 我如何将一个时间间隔转换为postgres的小时数?,datetime,postgresql,intervals,Datetime,Postgresql,Intervals,假设我有一个像 4 days 10:00:00 在研究生阶段。我如何将其转换为小时数(本例中为106小时?)是否有功能,或者我应该咬紧牙关,做类似的事情 extract(days, my_interval) * 24 + extract(hours, my_interval) 最简单的方法可能是: SELECT EXTRACT(epoch FROM my_interval)/3600 如果您想要整数,即天数: SELECT (EXTRACT(epoch FROM (SELECT (NOW(

假设我有一个像

4 days 10:00:00
在研究生阶段。我如何将其转换为小时数(本例中为106小时?)是否有功能,或者我应该咬紧牙关,做类似的事情

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

最简单的方法可能是:

SELECT EXTRACT(epoch FROM my_interval)/3600

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

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

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

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

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;

如果转换表字段:

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

     CREATE TABLE IF NOT EXISTS test (
         ...
         field        INTERVAL SECOND(0)
     );
    
  • 提取值记住投到int否则,一旦间隔过大,你可能会得到一个不愉快的惊喜:

    提取(从字段中提取历元)::int

  • ::int
    转换遵循四舍五入原则。
    如果您想要不同的结果,如向下舍入,您可以使用相应的数学函数,如
    floor

    ,如果间隔包含分钟和/或秒,可以使用floor或将结果转换为整数?哦,天哪,这在一百万年内都不会出现在我的脑海中。选择EXTRACT(epoch FROM my_interval/3600)(interval有本机的“除法整数”支持,结果是interval,而EXTRACT结果是integer,而不是float)。所以Autocast/Floor done.警告:简单地提取epoch隐式地假设一个月=30天,一年=365.25天。@Teddy我们可以用它做什么?如何避免这个问题,并获得真正的时代数?太好了!谢谢你:)然而,我发现我们现在可以将其修改为
    SELECT extract('epoch'FROM age('2014-08-02'::timestamp))/86400
    (我使用的是第9.4页),因为
    age(ts)
    当只有一个参数时自动使用
    当前日期
    。警告:简单地隐式提取历元会假定一个月=30天,一年=365.25天。如果间隔为
    “1个月0天”
    ,请使用
    提取(天从…)
    将给您
    0
    作为结果。注意:如果您的时间间隔包含月或年,则没有关于小时数的定义答案,因为一个月或一年中的天数不同。所以要小心@泰迪:更准确地说,有多个定义的答案;)这不需要区间值。我认为红移不支持区间数据类型。这只会是个大问题。
     CREATE TABLE IF NOT EXISTS test (
         ...
         field        INTERVAL SECOND(0)
     );
    
    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));