Вао Цун объяснил, почему.
Одним хорошим решением для вас может быть использование функции age
, которая форматирует интервал в годах, месяцах и днях:
SELECT date_part('month', age('2018-05-31'::timestamp, '2018-02-24'::timestamp));
date_part
-----------
3
(1 row)
Это даст более точные результаты, потому что не нужно предполагать, что в каждом месяце есть 30 дней.