Я думаю, что принятый ток неверен.
например. если вы измените дату «1900-01-01» на «2017-07-01», вы получите 6 квартальный дифференциал.
- Но ожидаемый результат должен быть:
- включают первый и последний квартал: 5
- исключить первый и последний квартал: 3
- без учета последнего квартала: 4
select
age('2018-09-05','2017-07-01') age,
(EXTRACT(QUARTER FROM TIMESTAMP '2018-09-05') +
date_part('year',age('2018-09-05','2017-07-01')) * 4) -1 QUARTER
Результат:
age |quarter|
--------------------|-------|
1 year 2 mons 4 days| 6|
Причина: age('2018-09-05','2017-07-01')
возврат 1 year 2 mons 4 days
(возможно, более 12 месяцев).
Ответ, который я использую для вычисления номера квартала:
with params as (
select
'2017-07-01 00:00:00'::timestamp date_from,
'2018-09-05 00:00:00'::timestamp date_to
)
select
extract( quarter from date_from)::int date_from_quarter,
(extract( quarter from date_to))::int date_to_quarter,
age(date_to, date_from) date_diff,
(extract(year from date_to) - extract(year from date_from))::int how_many_yr,
-- exclude begin and end
(extract(year from date_to) - extract(year from date_from))::int* 4 - extract( quarter from date_from)::int + (extract( quarter from date_to))::int - 1 quarter_diff,
-- exclude begin quarter
(extract(year from date_to) - extract(year from date_from))::int* 4 - extract( quarter from date_from)::int + (extract( quarter from date_to))::int quarter_diff_include_current_quarter
from params
;
Результат:
date_from_quarter|date_to_quarter|date_diff |how_many_yr|quarter_diff|quarter_diff_include_current_quarter|
-----------------|---------------|--------------------|-----------|------------|------------------------------------|
3| 3|1 year 2 mons 4 days| 1| 3| 4|