Để lọc các bản ghi có thời gian trong khoảng cách nhất định so với thời điểm hiện tại, dùng so sánh trực tiếp với NOW() (hoặc CURDATE()) kết hợp INTERVAL.
Ví dụ minh họa
Tạo bảng và chèn dữ liệu:
CREATE TABLE DemoTable1570 (ArrivalTime DATETIME);
INSERT INTO DemoTable1570 VALUES
('2019-10-15 05:10:00'), ('2019-10-15 23:00:00'),
('2019-10-15 23:10:00'), ('2019-10-15 16:10:00');
Giả sử NOW() = '2019-10-15 22:26:14'.
Lọc các bản ghi ArrivalTime trong 5 giờ gần nhất (từ 17:26:14 đến 22:26:14):
SELECT * FROM DemoTable1570 WHERE ArrivalTime > NOW() - INTERVAL 5 HOUR;
Kết quả
| ArrivalTime |
|---|
| 2019-10-15 23:00:00 |
| 2019-10-15 23:10:00 |
→ 2 bản ghi sau 17:26:14 (5h trước NOW).
Các biến thể INTERVAL phổ biến
| Cú pháp | Ý nghĩa |
|---|---|
INTERVAL 1 DAY | 1 ngày |
INTERVAL 3 HOUR | 3 giờ |
INTERVAL 30 MINUTE | 30 phút |
INTERVAL 6 MONTH | 6 tháng |
INTERVAL 1 YEAR | 1 năm |
INTERVAL '1 12' DAY_HOUR | 1 ngày 12 giờ (compound) |
Lưu ý hiệu năng
NOW()được đánh giá 1 lần cho toàn bộ truy vấn.- Biểu thức
ArrivalTime > NOW() - INTERVAL 5 HOURcó thể dùng index trênArrivalTime(sargable). - Tránh dùng hàm trên cột:
DATE(ArrivalTime) > ...sẽ làm mất index.
Mở rộng: Lọc theo khoảng thời gian cố định (không dùng NOW)
WHERE ArrivalTime BETWEEN '2019-10-15 17:00:00' AND '2019-10-15 22:00:00'