问题描述
|
如何确定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;