Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Lọc bản ghi đăng trước 3 ngày gần nhất trong MySQL với DATE_SUB

Để 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()?

  • BETWEEN bao gồm cả 2 đầu. NOW() có mili-giây → khó khớp chính xác.
  • Dùng >= start AND < end_exclusive an 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';