简化2个日期之间的月份计算(postgresql)

时间:2016-08-16 09:18:47

标签: postgresql date postgresql-9.1

这个问题被多次询问,其中一个建议的查询在2个日期之间得到月份不起作用。

SELECT date_part('month',age('2016-06-30', '2018-06-30'))

此查询的结果为0.应该是24个月。因为这两个月的月份都是06。

这有效,但与sql server函数相比有点笨拙:

SELECT date_part ('year', f) * 12 + date_part ('month', f) 
FROM age ('2016-06-30', '2018-06-30') f

像sql server一样(我认为):

DATEDIFF(month, date1, date2)

有没有简单的方法(如上所述)来计算Postgresql中2个日期之间的月份?如果可能的话,我不想使用函数。

2 个答案:

答案 0 :(得分:2)

不幸的是,您已经拥有了最优雅的解决方案。

如果您查看extract的文档(与date_part相同):

https://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT

  

     

对于时间戳值,一年中的月份数(1 - 12);对于间隔值,月数,模12(0 - 11)

SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 2

SELECT EXTRACT(MONTH FROM INTERVAL '2 years 3 months');
Result: 3

SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months');
Result: 1

对于你的问题,如果month的版本不是模12而是不存在,那将是很好的。

您拥有的选项(提取年份* 12 +月)是最佳选择。

修改

如果您想创建一个函数,请参阅以下两个函数:

CREATE OR REPLACE FUNCTION get_months(i interval) RETURNS double precision AS $$
    SELECT date_part ('year', i) * 12 + date_part ('month', i) ;
$$ LANGUAGE SQL IMMUTABLE;


SELECT get_months(age('2016-06-30', '2018-06-30'));

或者

CREATE OR REPLACE FUNCTION get_months(to_date date, from_date date) RETURNS double precision AS $$
    SELECT date_part ('year', f) * 12 + date_part ('month', f) 
      FROM age (to_date, from_date) f;
$$ LANGUAGE SQL IMMUTABLE;


SELECT get_months('2016-06-30', '2018-06-30');

你可以实际创建两者,然后只使用适合你代码的那些。

答案 1 :(得分:1)

这将为您提供两个日期之间的月数,不包括天数。

CREATE OR REPLACE FUNCTION get_months_between(to_date date, from_date date) RETURNS double precision AS $$
    SELECT (date_part ('year', to_date) * 12 + date_part ('month', to_date)) - (date_part ('year', from_date) * 12 + date_part ('month', from_date))

$$ LANGUAGE SQL IMMUTABLE;