在Postgres中,如果我执行以下操作:
select (now() - created_at) from my_table
我得到的结果如下:
854 days 12:04:50.29658
然而,如果我这样做:
select age(now(), created_at) fro my_table
我得到的结果如下:
2 years 4 mons 3 days 12:04:50.29658
根据pg_typeof(...)
,它们都属于interval
但如果我试着提取岁月:
select extract(years from age(now(), created_at)) from my_table
我明白了:
2
然而,有:
select extract(years from (now() - created_at)) from my_table
我明白了:
0
是否有一致的方法从区间值中提取年数(无论它是如何生成的)?
注意:我没有对数据库的写访问权限,因此无法定义存储过程等。需要是一个select语句。
------ 更新 ------
下面提出了 justify_interval(...)
,但不幸的是,它的计算似乎不准确。
E.g:
select age('2018-01-03'::timestamp, '2016-01-05'::timestamp);
给出了正确的答案:
1 year 11 mons 29 days
鉴于:
select justify_interval('2018-01-03'::timestamp - '2016-01-05'::timestamp);
给出:
2 years 9 days
我认为这是因为它(错误地)假设所有月份都有30天
(见justify_days
这里:https://www.postgresql.org/docs/current/static/functions-datetime.html)
答案 0 :(得分:1)
函数justify_interval
可以满足您的需求。与EXTRACT
结合使用可以获得年份:
SELECT EXTRACT(years FROM
justify_interval(INTERVAL '1 year 900 days 700 hours'));
date_part
-----------
3
(1 row)
如果30天= 1个月对您来说不够准确,那么您必须使用EXTRACT
来获取天数并除以365.25。
理论上有限制你有多精确,因为一个区间的年数在某种程度上取决于在哪个日期这个区间。
两元素age
函数给出了两个日期之间年数的精确结果。