Trong PostgreSQL, bạn có thể sử dụng OVERLAPS
để kiểm tra các khoảng thời gian trùng lặp.
Hàm trả về true khi hai khoảng thời gian (được xác định bởi điểm cuối của chúng) trùng nhau và false khi chúng không chồng lên nhau.
Cú pháp
Nó có thể được sử dụng theo hai cách sau:
(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2)
Nói cách khác, bạn cung cấp ngày / giờ bắt đầu, sau đó bạn có tùy chọn cung cấp ngày / giờ kết thúc hoặc khoảng thời gian.
Cụ thể hơn, các điểm cuối có thể được chỉ định dưới dạng các cặp ngày, giờ hoặc dấu thời gian; hoặc dưới dạng ngày, giờ hoặc dấu thời gian theo sau là khoảng thời gian.
Khi một cặp giá trị được cung cấp, phần đầu hoặc phần cuối có thể được viết trước; OVERLAPS
tự động lấy giá trị trước đó của cặp làm giá trị bắt đầu.
Ví dụ
Đây là một ví dụ cơ bản để chứng minh.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
(date '2022-02-09', date '2022-03-10');
Kết quả:
True
Kết quả là đúng vì cả hai khoảng thời gian trùng nhau.
Đây là một lần nữa, nhưng lần này tôi thay đổi các khoảng thời gian để chúng không trùng lặp.
SELECT (date '2022-01-09', date '2022-02-08') OVERLAPS
(date '2022-02-09', date '2022-03-08');
Kết quả:
False
Điểm cuối chung
Điều quan trọng cần lưu ý là mỗi khoảng thời gian được coi là đại diện cho khoảng thời gian nửa mở start
<=
time
<
end
, trừ khi start
và end
bằng nhau trong trường hợp đó nó đại diện cho thời điểm duy nhất đó. Điều này có nghĩa là hai khoảng thời gian chỉ có một điểm cuối chung không trùng lặp.
Trong ví dụ tiếp theo, khoảng thời gian thứ hai bắt đầu vào cùng ngày mà khoảng thời gian đầu tiên kết thúc.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
(date '2022-02-10', date '2022-03-10');
Kết quả:
False
Tuy nhiên, chúng tôi nhận được một kết quả khác nếu cả hai điểm cuối của khoảng thời gian đầu tiên đều giống nhau:
SELECT (date '2022-01-09', date '2022-01-09') OVERLAPS
(date '2022-01-09', date '2022-02-10');
Kết quả:
True
Khoảng thời gian
Như đã đề cập, điểm cuối thứ hai có thể là một khoảng thời gian.
SELECT (date '2022-01-09', interval '32 days') OVERLAPS
(date '2022-02-09', date '2022-03-10');
Kết quả:
True