PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Разберете броя на месеците между 2 дати

Изразът

age('2012-11-30 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp) 

дава 30 days . Очакваме 1 month тъй като и двете стойности сочат последните дни на месеца. Ако добавим 1 ден към стойностите, ще получим първите дни на следващия месец и

age('2012-12-01 00:00:00'::timestamp, '2012-11-01 00:00:00'::timestamp)

ще ни даде 1 месец, както се очаква. Така че нека проверим дали имаме два последни дни от месеца и в този случай върнем възрастовия интервал на следващите дни. В други случаи ще върнем възрастов интервал на първоначалните стойности:

create or replace function age_m (t1 timestamp, t2 timestamp)
returns interval language plpgsql immutable
as $$
declare
    _t1 timestamp = t1+ interval '1 day';
    _t2 timestamp = t2+ interval '1 day';
begin
    if extract(day from _t1) = 1 and extract(day from _t2) = 1 then
        return age(_t1, _t2);
    else
        return age(t1, t2);
    end if;
end $$;

Някои примери:

with my_table(date1, date2) as (
values
    ('2012-11-30 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp),
    ('2012-12-31 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp),
    ('2013-01-31 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp),
    ('2013-02-28 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp)
)

select *, age(date1, date2), age_m(date1, date2)
from my_table

        date1        |        date2        |      age       | age_m  
---------------------+---------------------+----------------+--------
 2012-11-30 00:00:00 | 2012-10-31 00:00:00 | 30 days        | 1 mon
 2012-12-31 00:00:00 | 2012-10-31 00:00:00 | 2 mons         | 2 mons
 2013-01-31 00:00:00 | 2012-10-31 00:00:00 | 3 mons         | 3 mons
 2013-02-28 00:00:00 | 2012-10-31 00:00:00 | 3 mons 28 days | 4 mons
(4 rows)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Генериране на данни и качество на хардуера

  2. Как мога да проверя уникод низ на Python, за да видя, че *всъщност* е правилен Unicode?

  3. Postgres:Преобразуване на varchar в текст

  4. Еволюция на отказоустойчивостта в PostgreSQL:Фаза на репликация

  5. Изявление за забавяне или изчакване