Để kiểm tra xem ngày hiện tại (CURDATE()) có nằm trong khoảng [StartDate, EndDate] của từng hàng hay không, MySQL cho phép so sánh trực tiếp trong SELECT để trả về kết quả boolean (1 = true, 0 = false).
Ví dụ minh họa
Tạo bảng khoảng ngày:
mysql> CREATE TABLE DemoTable1448 (
StartDate DATE,
EndDate DATE
);
Chèn dữ liệu:
mysql> INSERT INTO DemoTable1448 VALUES ('2019-01-21', '2019-03-22');
mysql> INSERT INTO DemoTable1448 VALUES ('2019-04-05', '2019-10-10');
mysql> INSERT INTO DemoTable1448 VALUES ('2019-10-01', '2019-10-29');
mysql> INSERT INTO DemoTable1448 VALUES ('2018-12-31', '2019-12-31');
Dữ liệu:
mysql> SELECT * FROM DemoTable1448;
+------------+------------+ | StartDate | EndDate | +------------+------------+ | 2019-01-21 | 2019-03-22 | | 2019-04-05 | 2019-10-10 | | 2019-10-01 | 2019-10-29 | | 2018-12-31 | 2019-12-31 | +------------+------------+
Giả sử hôm nay: 2019-10-05
Kiểm tra CURDATE() nằm trong khoảng
mysql> SELECT (CURDATE() >= StartDate AND CURDATE() <= EndDate) AS DateInRange
FROM DemoTable1448;
Kết quả (1 = có, 0 = không):
+-------------+ | DateInRange | +-------------+ | 0 | | 1 | | 1 | | 1 | +-------------+
Giải thích
- Hàng 1: 2019-10-05 không trong [2019-01-21, 2019-03-22] → 0.
- Hàng 2: 2019-10-05 trong [2019-04-05, 2019-10-10] → 1.
- Hàng 3: 2019-10-05 trong [2019-10-01, 2019-10-29] → 1.
- Hàng 4: 2019-10-05 trong [2018-12-31, 2019-12-31] → 1.
Các biến thể hữu ích
| Mục đích | Cú pháp |
|---|---|
| Chỉ lấy hàng đang hiệu lực | WHERE CURDATE() BETWEEN StartDate AND EndDate |
| Hiển thị text thay vì 1/0 | SELECT IF(CURDATE() BETWEEN StartDate AND EndDate, 'Active', 'Inactive') AS Status FROM ... |
| Đếm số khoảng đang hiệu lực | SELECT COUNT(*) FROM DemoTable1448 WHERE CURDATE() BETWEEN StartDate AND EndDate |
| Kiểm tra datetime (có giờ) | WHERE NOW() BETWEEN StartDateTime AND EndDateTime |
Ứng dụng thực tế
- Chương trình khuyến mãi / ưu đãi theo thời gian.
- Hợp đồng, bảo hiểm, thuê bao có hiệu lực.
- Ca làm việc, lịch sự kiện.
- Feature flag theo ngày.
Hiệu năng
- Tạo composite index trên
(StartDate, EndDate)để tối ưuWHERE CURDATE() BETWEEN StartDate AND EndDate. - MySQL có thể dùng
Index Range Scannếu điều kiện selective.