Tóm tắt
Dùng DATE_SUB(DATE(NOW()), INTERVAL n DAY) để tính ngày n ngày trước, kết hợp BETWEEN lọc khoảng.
Cú pháp
SELECT * FROM bang
WHERE cot_datetime BETWEEN DATE_SUB(DATE(NOW()), INTERVAL 2 DAY)
AND DATE_SUB(DATE(NOW()), INTERVAL 1 DAY);
Lấy bản ghi từ 2 ngày trước đến 1 ngày trước (không bao gồm hôm nay).
Ví dụ
1. Tạo bảng
CREATE TABLE get2daysAgoDemo (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(20),
PostDateTime DATETIME
);
2. Dữ liệu (giả sử hôm nay 2019-02-15)
INSERT INTO get2daysAgoDemo (Name, PostDateTime) VALUES
('Larry', NOW()), -- 2019-02-15
('Mike', '2019-02-13'), -- 2 ngày trước
('Sam', '2019-01-31'), -- cũ
('Bob', '2019-02-14'), -- 1 ngày trước
('David', '2019-02-12'), -- 3 ngày trước
('Carol', '2019-02-11'); -- 4 ngày trước
3. Truy vấn
SELECT * FROM get2daysAgoDemo
WHERE PostDateTime BETWEEN DATE_SUB(DATE(NOW()), INTERVAL 2 DAY)
AND DATE_SUB(DATE(NOW()), INTERVAL 1 DAY);
4. Kết quả (2019-02-13 và 2019-02-14)
+----+------+---------------------+
| Id | Name | PostDateTime |
+----+------+---------------------+
| 2 | Mike | 2019-02-13 00:00:00 |
| 4 | Bob | 2019-02-14 00:00:00 |
+----+------+---------------------+
Biến thể thường dùng
| Mục đích | WHERE |
|---|---|
| 7 ngày qua (bao gồm hôm nay) | WHERE dt >= DATE_SUB(CURDATE(), INTERVAL 6 DAY) |
| 30 ngày qua | WHERE dt >= DATE_SUB(CURDATE(), INTERVAL 29 DAY) |
| Tháng này | WHERE dt >= DATE_FORMAT(NOW(), '%Y-%m-01') |
| Tuần này (Thứ 2 - CN) | WHERE dt >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) |
Lưu ý
DATE(NOW())lấy phần ngày (bỏ giờ) – so sánh chính xác ngày.- Nếu cột là DATETIME,
BETWEEN '2019-02-13' AND '2019-02-14'ngụ ý '2019-02-13 00:00:00' đến '2019-02-14 00:00:00' – **bỏ lỡ giờ trong ngày 14**. Khuyến nghị dùng>= start AND < end_of_next_day. - Chuẩn hơn:
WHERE dt >= DATE_SUB(CURDATE(), INTERVAL 2 DAY) AND dt < DATE_SUB(CURDATE(), INTERVAL 1 DAY).