PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Sprawdź liczbę miesięcy między 2 datami

Wyrażenie

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

daje 30 days . Spodziewamy się 1 month ponieważ obie wartości wskazują na ostatnie dni miesiąca. Jeśli dodamy 1 dzień do wartości, otrzymamy pierwsze dni następnego miesiąca i

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

da nam 1 miesiąc zgodnie z oczekiwaniami. Sprawdźmy więc, czy mamy dwa ostatnie dni miesiąca i w takim przypadku zwróćmy przedział wiekowy kolejnych dni. W innych przypadkach zwrócimy przedział wiekowy oryginalnych wartości:

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 $$;

Kilka przykładów:

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. Suma wszystkich wierszy z pandami z wyjątkiem jednej

  2. Trendy PostgreSQL:najpopularniejsi dostawcy chmury, języki, VACUUM, strategie zarządzania zapytaniami i typy wdrożeń w przedsiębiorstwach

  3. pg_dump:nieprawidłowa opcja -- i podczas migracji

  4. Przegląd metod JOIN w PostgreSQL

  5. Szukam numeru telefonu zawierającego minus, np. 123-456789