Để lấy các bài viết/nghiệp vụ trong khoảng thời gian gần nhất (ví dụ: 3 ngày qua), dùng BETWEEN DATE_SUB(NOW(), INTERVAL 3 DAY) AND NOW() hoặc so sánh trực tiếp.
Ví dụ minh họa
Giả sử hôm nay 2019-10-20.
Tạo bảng và chèn dữ liệu:
CREATE TABLE DemoTable1582 (PostedDate DATETIME);
INSERT INTO DemoTable1582 VALUES
('2019-01-21 12:34:40'), ('2019-10-15 11:00:00'), ('2019-10-25 01:10:00');
Lọc bản ghi trong 3 ngày qua (từ 2019-10-17 đến 2019-10-20):
SELECT * FROM DemoTable1582 WHERE PostedDate BETWEEN DATE_SUB(NOW(), INTERVAL 3 DAY) AND NOW();
Kết quả (giả sử NOW = 2019-10-20)
| PostedDate |
|---|
| 2019-01-21 12:34:40 |
| 2019-10-15 11:00:00 |
→ Kết quả ví dụ gốc có vẻ không đúng logic (2019-01-21 và 2019-10-15 đều < 2019-10-17). Có thể ví dụ dùng PostedDate làm tham chiếu thay vì NOW().
Cách viết chuẩn hơn
-- 3 ngày gần nhất từ hôm nay WHERE PostedDate >= DATE_SUB(CURDATE(), INTERVAL 3 DAY) AND PostedDate < CURDATE() + INTERVAL 1 DAY; -- Hoặc dùng NOW() cho datetime chính xác WHERE PostedDate >= DATE_SUB(NOW(), INTERVAL 3 DAY) AND PostedDate <= NOW();
Tại sao không dùng BETWEEN với NOW()?
BETWEENbao gồm cả 2 đầu.NOW()có mili-giây → khó khớp chính xác.- Dùng
>= start AND < end_exclusivean toàn hơn.
Hiệu năng: Index trên PostedDate
CREATE INDEX idx_posted_date ON DemoTable1582(PostedDate);
Câu query trên sẽ dùng index range scan (sargable).
Mở rộng: "3 ngày trước một ngày cụ thể"
WHERE PostedDate BETWEEN DATE_SUB('2019-10-20', INTERVAL 3 DAY) AND '2019-10-20';