2015-02-18 27 views
6

Tôi có một bảng chứa cột d_date. Trong cột này, chỉ chứa giá trị ngày.Tìm ngày bị thiếu (PostgreSQL)

Câu hỏi của tôi là "Tôi muốn tìm các ngày bị thiếu trong cột này (d_date)".

ví dụ: Cột này chứa ngày từ "1 tháng 1 năm 2007" đến "7 tháng 1 năm 2007" sau đó tôi muốn tìm ngày bị thiếu giữa "1-Jan-2007" đến "10-Jan-2007 " và kết quả của tôi phải là" 8 tháng 1 năm 2007 "," ngày 9 tháng 1 năm 2007 "," ngày 10 tháng 1 năm 2007 ".

Vì vậy, làm cách nào tôi có thể nhận được kết quả này?

Trả lời

8

Bạn có thể so sánh một loạt ngày tạo với chức năng generate_series(start, stop, step interval) đến ngày tháng trong bảng của bạn:

SELECT * FROM generate_series('2007-01-01', '2007-01-10', interval '1 day') AS dates 
    WHERE dates NOT IN (SELECT d_date FROM your_table); 

Thông tin thêm về chức năng generate_series từ tài liệu PostgreSQL: 9.24. Set Returning Functions.

0

Bạn có thể sử dụng WITH RECURSIVE để xây dựng một bảng của ngày và sau đó chọn thời gian nghỉ mà không phải là trong bảng của bạn:

WITH RECURSIVE t(d) AS (
    (SELECT '2015-01-01'::date) 
UNION ALL 
    (SELECT d + 1 FROM t WHERE d + 1 <= '2015-01-10') 
) SELECT d FROM t WHERE d NOT IN (SELECT d_date FROM tbl); 

Edit: thông báo rằng một CTE đệ quy có thể là một quá mức cần thiết ở đây. Epikuros's answer cung cấp giải pháp đơn giản hơn với generate_series.

+2

Không cần CTE đệ quy - 'generate_series()' sẽ hiệu quả hơn –

+0

@a_horse_with_no_name true. Chỉnh sửa. –

Các vấn đề liên quan