如何确定INTERVAL的最大分辨率?

时间:2011-06-16 15:32:22

标签: sql postgresql intervals

如何确定INTERVAL值的最大分辨率?例如:

  • INTERVAL '100 days and 3 seconds' =>天
  • TIME '20:05' - TIME '12:01:01' =>小时
  • AGE(NOW(), NOW() - INTERVAL '1 MONTH') =>月

2 个答案:

答案 0 :(得分:2)

问题不是100%明确,所以答案可能正是您正在寻找的,也可能不是......但是......

您可能需要查看justify_interval()函数。

test=# select justify_interval(INTERVAL '100 days 3 seconds');
    justify_interval     
-------------------------
 3 mons 10 days 00:00:03
(1 row)

test=# select justify_interval(TIME '20:05' - TIME '12:01:01');
 justify_interval 
------------------
 08:03:59
(1 row)

test=# select justify_interval(AGE(NOW(), NOW() - INTERVAL '1 MONTH'));
 justify_interval 
------------------
 1 mon
(1 row)

因为那里提取年份,然后是月份,然后是日期等等,直到你得出一个非零答案:

test=# select extract('mon' from interval '3 mons 10 days 00:00:03');
 date_part 
-----------
         3

在评论中回答你的其他问题:

create function max_res(interval) returns interval as $$
select case
       when extract('year' from justify_interval($1)) > 0 or
            extract('mon' from justify_interval($1)) > 0 or
            extract('day' from justify_interval($1)) > 0
       then '1 day'
       when extract('hour' from justify_interval($1)) > 0
       then '1 hour'
       when ...
       end;
$$ language sql immutable strict;

答案 1 :(得分:1)

INTERVAL是12个字节,是一个包含月,日和微秒的结构,其范围为+/- 17800万年。由于存储此信息的方式,它的最大固定大小始终为178亿年。

小心你对“一个月”的理解,因为朱利安月不是一个常数,就像hourminute一样(例如,月份中有多少天) 2月?或year中有多少天?实际上并不总是30或365而且PostgreSQL正确更新内容。根据IRC上的有趣对话,将1 month :: INTERVAL添加到1月30日将导致2月的最后一天,因为它增加了tm_mon的{​​{1}}成员(在这种情况下,回滚到上一个有效日期)。


啊哈哈!我现在得到了这个问题(至少我是这么认为的)。您希望确定给定struct tm的最大“非零整数单位”。

PostgreSQL没有返回该信息的内置函数。我认为你将不得不链接条件和返回类型。一些示例INTERVAL代码:

PL