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

Làm thế nào để đếm ngày trừ Chủ nhật giữa hai ngày trong Postgres?

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 gian
interval 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để cài đặt libpq-fe.h?

  2. Lỗi:Cột không tồn tại

  3. Các từ khóa NGAY LẬP TỨC, ỔN ĐỊNH và VOLATILE ảnh hưởng đến hành vi của chức năng như thế nào?

  4. PostgreSQL:Tại sao psql không thể kết nối với máy chủ?

  5. Cấu trúc lại một hàm PL / pgSQL để trả về kết quả đầu ra của các truy vấn SELECT khác nhau