Mục tiêu
Lấy các bản ghi có thời gian (datetime) rơi trong khoảng 12 giờ tới từ thời điểm hiện tại.
Công thức sử dụng
Sử dụng hàm DATE_ADD() kết hợp INTERVAL:
SELECT * FROM ten_bang
WHERE DATE_ADD(cot_thoi_gian, INTERVAL 12 HOUR)
BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 12 HOUR);
Ví dụ chi tiết
Tạo bảng DemoTable với cột DueDateTime:
CREATE TABLE DemoTable (DueDateTime DATETIME);
Chèn dữ liệu mẫu (giả sử ngày hiện tại là 2019-07-12):
INSERT INTO DemoTable VALUES
('2019-07-12 10:50:30'),
('2019-07-12 22:02:00'),
('2019-07-12 11:12:10'),
('2019-07-12 09:02:00');
Truy vấn lấy bản ghi trong 12 giờ tới:
SELECT * FROM DemoTable
WHERE DATE_ADD(DueDateTime, INTERVAL 12 HOUR)
BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 12 HOUR);
Kết quả (giả sử NOW() = '2019-07-12 10:00:00'):
+---------------------+
| DueDateTime |
+---------------------+
| 2019-07-12 10:50:30 |
| 2019-07-12 22:02:00 |
| 2019-07-12 11:12:10 |
+---------------------+
Giải thích logic
DATE_ADD(DueDateTime, INTERVAL 12 HOUR): Thời điểm hết hạn + 12h.BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 12 HOUR): Khoảng từ bây giờ đến 12h tới.- Bản ghi thỏa mãn: Thời điểm (DueDateTime + 12h) rơi trong khoảng [NOW, NOW+12h].
Cách viết thay thế (thường hiệu quả hơn)
SELECT * FROM DemoTable
WHERE DueDateTime BETWEEN DATE_SUB(NOW(), INTERVAL 12 HOUR) AND NOW();
Cách này cho phép sử dụng index trên cột DueDateTime (sargable).