如何确定间隔的最大分辨率?

| 如何确定INTERVAL值的最大分辨率?例如:
INTERVAL \'100 days and 3 seconds\'
=>天
TIME \'20:05\' - TIME \'12:01:01\'
=>小时
AGE(NOW(), NOW() - INTERVAL \'1 MONTH\')
=>月     
已邀请:
        这个问题不是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;
    
        “ 7”是12个字节,是一个包含月,日和微秒的结构,范围为+/- 178000000年。由于其存储此信息的方式,它始终具有178000000年的固定最大大小。 注意您对“一个月”的理解要小心,因为儒略历月不是一个常数,而是等于8英镑或9英镑(例如,二月份的天数是多少?一个
year
?实际上并不总是30或365,PostgreSQL在IRC上进行一次有趣的对话,在1月30日加上
1 month
:: INTERVAL会导致2月的最后一天,因为它会增加
tm_mon
成员
struct tm
(在这种情况下,将回滚到上一个有效日期)。 啊哈!我现在得到了问题(或者至少我是这样认为的)。您正在寻找确定给定的
INTERVAL
的最大“非零整数单位”。 PostgreSQL没有返回该信息的内置函数。我认为您将必须链接条件和返回类型。 example15ѭ代码示例:
t := EXTRACT(EPOCH FROM my_time_input);
IF t >= 31104000 THEN
  RETURN \'year\';
ELSIF t >= 2592000 THEN
  RETURN \'month\';
ELSIF t >= 604800 THEN
  RETURN \'week\';
ELSIF t >= 86400 THEN
  RETURN \'day\';
ELSIF t >= 3600 THEN
  RETURN \'hour\';
ELSIF t >= 60 THEN
  RETURN \'minute\'
ELSIF t > 1 THEN
  RETURN \'seconds\';
ELSIF t == 1 THEN
  RETURN \'second\';
ELSE
  RETURN resolve_largest_sub_second_unit(my_time);
END IF;
    

要回复问题请先登录注册