这个问题被多次询问,其中一个建议的查询在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个日期之间的月份?如果可能的话,我不想使用函数。
答案 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;