有没有可靠的方法从postgres间隔中提取年份?

时间:2018-03-09 13:01:31

标签: postgresql

在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

1 个答案:

答案 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函数给出了两个日期之间年数的精确结果。