请注意,在尝试使用@ram和@angelin最受欢迎的答案计算日历月份差异时,该答案不准确。
select extract(year from age(timestamp1, timestamp2))*12 + extract(month from age(timestamp1, timestamp2))
例如,如果您尝试执行:
select extract(year from age('2018-02-02'::date, '2018-03-01'::date))*12 + extract(month from age('2018-02-02'::date , '2018-03-01'::date))
结果将为0,但从二月到三月的月份差应该为1,不管日期之间的天数。
因此,公式应该如下所示,表示我们从时间戳1和时间戳2开始:
((year2-year1)*12) - month1 + month2 = 两个时间戳之间的日历月数
在pg中,它会被翻译为:
select ((extract('years' from '2018-03-01 00:00:00'::timestamp)::int - extract('years' from '2018-02-02 00:00:00'::timestamp)::int) * 12)
- extract('month' from '2018-02-02 00:00:00'::timestamp)::int + extract('month' from '2018-03-01 00:00:00'::timestamp)::int;
你可以创建一个如下的函数:
CREATE FUNCTION months_between (t_start timestamp, t_end timestamp)
RETURNS integer
AS $$
select ((extract('years' from $2)::int - extract('years' from $1)::int) * 12)
- extract('month' from $1)::int + extract('month' from $2)::int
$$
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;