Giải pháp: BETWEEN với NOW()
Sử dụng NOW() BETWEEN start_date AND end_date để kiểm tra thời điểm hiện tại có trong khoảng.
Ví dụ minh họa
Tạo bảng khoảng thời gian
mysql> CREATE TABLE DemoTable (
FirstDate DATETIME,
SecondDate DATETIME
);
mysql> INSERT INTO DemoTable VALUES('2019-04-01', '2019-05-02');
mysql> INSERT INTO DemoTable VALUES('2019-05-28', '2019-06-04');
mysql> INSERT INTO DemoTable VALUES('2016-01-31', '2019-03-01');
Dữ liệu gốc
+-----------------------+-----------------------+ | FirstDate | SecondDate | +-----------------------+-----------------------+ | 2019-04-01 00:00:00 | 2019-05-02 00:00:00 | | 2019-05-28 00:00:00 | 2019-06-04 00:00:00 | | 2016-01-31 00:00:00 | 2019-03-01 00:00:00 | +-----------------------+-----------------------+
Giả sử NOW() = '2019-05-30 10:00:00'
Truy vấn
mysql> SELECT * FROM DemoTable
-> WHERE NOW() BETWEEN FirstDate AND SecondDate;
Kết quả
+-----------------------+-----------------------+ | FirstDate | SecondDate | +-----------------------+-----------------------+ | 2019-05-28 00:00:00 | 2019-06-04 00:00:00 | +-----------------------+-----------------------+
Giải thích
BETWEENinclusive:FirstDate <= NOW() AND NOW() <= SecondDateNOW()trả về DATETIME hiện tại (có giờ)- So sánh DATETIME với DATETIME: chính xác
Các biến thể
| Cú pháp | Dùng khi |
|---|---|
NOW() BETWEEN start AND end | Cột DATETIME/TIMESTAMP |
CURDATE() BETWEEN start AND end | Cột DATE (chỉ so sánh ngày) |
DATE(NOW()) BETWEEN start AND end | Cột DATE, so sánh phần ngày |
start <= NOW() AND NOW() <= end | Tường minh, dễ đọc hơn |
Ứng dụng thực tế
Khuyến mãi đang hoạt động
SELECT * FROM promotions WHERE NOW() BETWEEN start_date AND end_date AND status = 'active';
Ca làm việc hiện tại
SELECT * FROM shifts WHERE NOW() BETWEEN shift_start AND shift_end;
Hết hạn subscription
SELECT * FROM subscriptions WHERE NOW() > end_date AND status = 'active';
Lưu ý Timezone
NOW()trả về thời gian theo@@session.time_zone- Dữ liệu TIMESTAMP lưu UTC, chuyển đổi khi đọc
- DATETIME lưu nguyên giá trị nhập (không chuyển timezone)
- Đồng bộ timezone app và DB để tránh lệch