【问题标题】:why justify_interval('360 days'::interval) results '1 year'为什么 justify_interval('360 days'::interval) 结果是 '1 年'
【发布时间】:2017-02-14 13:53:08
【问题描述】:

由于某种原因justify_interval(now() - '2013-02-14'::timestamptz) 产生了奇怪的结果:

postgres=# select justify_interval(concat(365*4 +1,' days')::interval);                       -[ RECORD 1 ]----+----------------
justify_interval | 4 years 21 days

我检查了一年:

postgres=# select justify_interval('365 days'::interval);
 justify_interval
------------------
 1 year 5 days

所以我更进一步:

postgres=# select justify_interval('360 days'::interval);
 justify_interval
------------------
 1 year
(1 row)

此行为不是特定于平台的(尝试了几个 Linux,9.2、9.3、9.6)

为什么一年是 360 天?..

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    您似乎正在寻找一些东西,PostgreSQL 将其称为使用年和月而不是仅仅几天的“符号”结果,这就是 age(timestamp, timestamp)(和 age(timestamp) ) 函数返回。

    select age(now(), '2013-02-14');    -- 4 years 16:41:02.571547
    select age(timestamp '2013-02-14'); -- 4 years
    

    - 运算符总是返回天数的差异(最多)。 justify_*() 函数(以及 */<> 运算符)总是将值“切割”为平均值(即,1 day24 hours1 month30 days )尽管事实上 1 天实际上可以包含 23-25 小时(想想夏令时区)并且 1 个月可以包含 28-31 天(因此结果取决于范围的实际起点和终点,这会创建间隔)。

    【讨论】:

      【解决方案2】:

      accrding to docs:

      justify_interval(interval) - 使用 justify_days 和调整间隔 justify_hours,带有额外的符号调整

      还有:

      justify_days(interval) - 将间隔调整为 30 天的时间段 表示为月份

      所以30*12=360

      不是预期的,但显然在文档中定义...

      【讨论】:

        猜你喜欢
        • 2019-01-11
        • 2021-07-14
        • 2013-10-02
        • 2021-02-24
        • 2012-11-02
        • 2014-12-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多