Cách thêm số ngày trong datetime postgresql


79

Tôi có một bảng sau đây projects.

id title        created_at                     claim_window
1  Project One  2012-05-08 13:50:09.924437     5
2  Project Two  2012-06-01 13:50:09.924437     10

A) Tôi muốn tìm thời hạn bằng phép tính deadline = created_at + claim_window(No. of days) .

Một cái gì đó như sau.

id title        created_at                     claim_window deadline
1  Project One  2012-05-08 13:50:09.924437     5            2012-05-13 13:50:09.924437
2  Project Two  2012-06-01 13:50:09.924437     10           2012-06-11 13:50:09.924437

B] Tôi cũng muốn tìm các dự án đã hết thời hạn

id title        created_at                     claim_window deadline
1  Project One  2012-05-08 13:50:09.924437     5            2012-05-13 13:50:09.924437

Tôi thử một cái gì đó như sau.

SELECT * FROM "projects" WHERE (DATE_PART('day', now()- created_at) >= (claim_window+1))

Nhưng vì một số lý do nó không hoạt động.

Câu trả lời:


134

Điều này sẽ cung cấp cho bạn thời hạn:

select id,  
       title,
       created_at + interval '1' day * claim_window as deadline
from projects

Ngoài ra, chức năng này make_intervalcó thể được sử dụng:

select id,  
       title,
       created_at + make_interval(days => claim_window) as deadline
from projects

Để nhận được tất cả các dự án đã hết thời hạn, hãy sử dụng:

select *
from (
  select id, 
         created_at + interval '1' day * claim_window as deadline
  from projects
) t
where localtimestamp at time zone 'UTC' > deadline

nhưng một vấn đề nữa xảy ra là create_at của tôi có kiểu dữ liệu timestamp without time zoneVÀ current_timestamp có kiểu dữ liệu timestamp with time zone, do đó tôi không nhận được câu trả lời chính xác
Salil

@Salil: LOCALTIMESTAMPis atimestamp without time zone
a_horse_with_no_name

@Salil: Điều đó cũng không quan trọng, kết quả sẽ giống nhau với một trong hai timestamphoặc timestamptz, miễn là dữ liệu đề cập đến cùng một thời điểm. Thêm một ngày có tác dụng tương tự đối với cả hai.
Erwin Brandstetter

create_at của tôi là được lưu trong thời gian UTC (W / o múi giờ) và LOCALTIMESTAMP & CURRENT_TIMESTAMP mang lại cho tôi thời gian trong 5,30, do đó probles vẫn chưa được giải quyết
Salil

@Salil: sau đó lại tính toán localtimestamp để utc sử dụnglocaltimestamp at time zone 'UTC'
a_horse_with_no_name

17

Đối với tôi, tôi phải đặt toàn bộ khoảng trong dấu ngoặc kép chứ không chỉ giá trị của khoảng.

select id,  
   title,
   created_at + interval '1 day' * claim_window as deadline from projects   

Thay vì

select id,  
   title,
   created_at + interval '1' day * claim_window as deadline from projects   

Chức năng Ngày / Giờ của Postgres

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.