PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tìm ra số tháng giữa 2 ngày

Biểu thức

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

cho 30 days . Chúng tôi đang mong đợi 1 month vì cả hai giá trị đều trỏ đến những ngày cuối cùng của tháng. Nếu chúng tôi thêm 1 ngày vào các giá trị, chúng tôi sẽ nhận được những ngày đầu tiên của tháng tới và

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

sẽ cho chúng tôi 1 tháng như mong đợi. Vì vậy, chúng ta hãy kiểm tra xem chúng ta có hai ngày cuối cùng của tháng hay không và trong trường hợp này là khoảng thời gian trả về tuổi của những ngày tiếp theo. Trong các trường hợp khác, chúng tôi sẽ trả về khoảng tuổi của các giá trị ban đầu:

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

Một số ví dụ:

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. SQLAlchemy func.count trên cột boolean

  2. Làm thế nào tôi có thể xác định ràng buộc này?

  3. chèn các giá trị DEFAULT

  4. '$$' được sử dụng để làm gì trong PL / pgSQL

  5. Cách biết khi nào một bảng Postgres được nhóm và những chỉ mục nào được sử dụng