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

So sánh phạm vi ngày

Đây là một vấn đề cổ điển và nó thực sự dễ dàng hơn nếu bạn đảo ngược logic.

Để tôi cho bạn một ví dụ.

Tôi sẽ đăng một khoảng thời gian ở đây và tất cả các biến thể khác nhau của các khoảng thời gian khác trùng lặp theo một cách nào đó.

           |-------------------|          compare to this one
               |---------|                contained within
           |----------|                   contained within, equal start
                   |-----------|          contained within, equal end
           |-------------------|          contained within, equal start+end
     |------------|                       not fully contained, overlaps start
                   |---------------|      not fully contained, overlaps end
     |-------------------------|          overlaps start, bigger
           |-----------------------|      overlaps end, bigger
     |------------------------------|     overlaps entire period

mặt khác, hãy để tôi đăng tất cả những thứ không trùng lặp:

           |-------------------|          compare to this one
     |---|                                ends before
                                 |---|    starts after

Vì vậy, nếu bạn đơn giản, hãy giảm so sánh thành:

starts after end
ends before start

sau đó bạn sẽ tìm thấy tất cả những khoảng thời gian không trùng nhau và sau đó bạn sẽ tìm thấy tất cả các khoảng thời gian không trùng khớp.

Đối với ví dụ KHÔNG TRONG DANH SÁCH cuối cùng của bạn, bạn có thể thấy rằng nó phù hợp với hai quy tắc đó.

Bạn sẽ cần quyết định thời kỳ sau ở TRONG hay NGOÀI phạm vi của bạn:

           |-------------|
   |-------|                       equal end with start of comparison period
                         |-----|   equal start with end of comparison period

Nếu bảng của bạn có các cột được gọi là range_end và range_start, đây là một số SQL đơn giản để truy xuất tất cả các hàng phù hợp:

SELECT *
FROM periods
WHERE NOT (range_start > @check_period_end
           OR range_end < @check_period_start)

Lưu ý KHÔNG trong đó. Vì hai quy tắc đơn giản tìm thấy tất cả không phù hợp hàng, một ký tự KHÔNG đơn giản sẽ đảo ngược nó để nói: nếu nó không phải là một trong những hàng không khớp, nó phải là một trong những hàng phù hợp .

Áp dụng logic đảo ngược đơn giản ở đây để loại bỏ KHÔNG và bạn sẽ kết thúc với:

SELECT *
FROM periods
WHERE range_start <= @check_period_end
      AND range_end >= @check_period_start


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - Trừ giá trị từ hàng trước, nhóm theo

  2. PHP - Bảo mật các trang chỉ dành cho thành viên với hệ thống đăng nhập

  3. Làm thế nào để chuyển đổi kết quả Truy vấn SQL sang Cấu trúc Dữ liệu PANDAS?

  4. Cập nhật một cột trong MySQL

  5. mysqli_stmt ::bind_param ():Số phần tử trong chuỗi định nghĩa kiểu không khớp với số biến ràng buộc