Bạn cần xác định "giữa hai ngày" gần hơn. Giới hạn dưới và giới hạn trên bao gồm hay bị loại trừ? Định nghĩa chung sẽ là bao gồm thấp hơn và loại trừ giới hạn trên của một khoảng. Thêm vào đó, xác định kết quả là 0 khi giới hạn dưới và giới hạn trên giống hệt nhau. Định nghĩa này trùng hợp với phép trừ ngày chính xác .
SELECT date '2017-01-31' - date '2017-01-01' AS days_between
Định nghĩa chính xác này rất quan trọng để loại trừ Chủ nhật. Đối với định nghĩa đã cho, khoảng thời gian từ Mặt trời - Mặt trời (1 tuần sau) không bao gồm giới hạn trên, vì vậy chỉ có 1 Chủ nhật để trừ.
Khoảng thời gianinterval in days | sundays
0 | 0
1-6 | 0 or 1
7 | 1
8-13 | 1 or 2
14 | 2
...
Khoảng thời gian 7 ngày luôn bao gồm đúng một ngày Chủ nhật.
Chúng tôi có thể nhận được kết quả tối thiểu với phép chia số nguyên đơn giản ( ngày / 7 ), cắt ngắn kết quả.
Chủ nhật thêm trong khoảng thời gian còn lại của 1 - 6 ngày phụ thuộc vào ngày đầu tiên của khoảng thời gian đó. Nếu là chủ nhật, chơi lô tô; nếu đó là ngày thứ Hai, quá tệ. Vv. Chúng ta có thể rút ra một công thức đơn giản từ sau:
SELECT days, sundays, days - sundays AS days_without_sundays
FROM (
SELECT z - a AS days
, ((z - a) + EXTRACT(isodow FROM a)::int - 1 ) / 7 AS sundays
FROM (SELECT date '2017-01-02' AS a -- your interval here
, date '2017-01-30' AS z) tbl
) sub;
Hoạt động cho bất kỳ khoảng thời gian nhất định.
Lưu ý:isodow
, không phải dow
cho EXTRACT()
.
Để bao gồm giới hạn trên, chỉ cần thay thế z - a
với (z - a) + 1
. (Sẽ hoạt động mà không có dấu ngoặc đơn, do toán tử được ưu tiên hơn, nhưng tốt hơn là phải rõ ràng.)
Đặc tính hiệu suất là O (1) (hằng số) trái ngược với tổng hợp có điều kiện trên một tập hợp được tạo với O (N) .
Có liên quan:
- Làm cách nào để xác định ngày cuối cùng của tháng trước bằng PostgreSQL?
- Tính giờ làm việc giữa 2 ngày trong PostgreSQL