Как я могу получить количество четвертей между двумя датами в PostgreSQL? - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть функция MS SQL DATEDIFF

SELECT DATEDIFF(QQ, 0, '2018-09-05')

, который возвращает 474 (целое число).

Что такое PostgreSQL эквивалент этой функции?

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

MSSQL 0 - это дата '1900-01-01' в DATEDIFF(QQ, 0, '2018-09-05'), эта функция получит число QUARTER от 1900-01-01 до 2018-09-05

Но PostgreSQL не имеет числовой функции QUARTER.

Вы можете попробовать использовать

  1. EXTRACT(QUARTER FROM TIMESTAMP '2018-09-05'), чтобы получить номер этого месяца QUARTER.

  2. date_part('year',age('2018-09-05','1900-01-01')) получить номер года между '2018-09-05' и '1900-01-01'.

затем сделайте некоторый расчет.

select (EXTRACT(QUARTER FROM TIMESTAMP '2018-09-05') + 
      date_part('year',age('2018-09-05','1900-01-01')) * 4) -1 QUARTER

Результаты

| quarter |
|---------|
|     474 |
0 голосов
/ 02 мая 2019

Я думаю, что принятый ток неверен.

например. если вы измените дату «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|
0 голосов
/ 06 сентября 2018

Сложно на Postgres:

( (DATE_PART('year',  '2018-09-05') - DATE_PART('year', '1900-01-01')) * 12 
   + (DATE_PART('month',  '2018-09-05') - DATE_PART('month', '1900-01-01'))
) / 4

Дополнительные ресурсы: тема

...