Cú pháp dùng DATEDIFF
DELETE FROM bang
WHERE DATEDIFF(NOW(), cot_ngay) > 5;
DATEDIFF(date1, date2): Trả về date1 - date2 (số ngày, có thể âm)
NOW(): Thời điểm hiện tại
> 5: Chênh lệch > 5 ngày (tức là ≥ 6 ngày trước)
Ví dụ: Giả sử hôm nay 2019-03-10
Dữ liệu
+----+---------+------------+
| Id | Name | Post_Date |
+----+---------+------------+
| 1 | Larry | 2019-03-11 | -- Tương lai (1 ngày sau)
| 2 | Mike | 2019-02-12 | -- 26 ngày trước
| 3 | Sam | 2019-03-10 | -- Hôm nay (0 ngày)
| 4 | Carol | 2019-03-01 | -- 9 ngày trước
| 5 | David | 2019-01-31 | -- 38 ngày trước
| 6 | Maxwell | 2019-01-26 | -- 43 ngày trước
| 7 | John | 2019-02-19 | -- 19 ngày trước
+----+---------+------------+
Truy vấn
mysql> DELETE FROM deleteRowsOlderThan5Demo
-> WHERE DATEDIFF(NOW(), deleteRowsOlderThan5Demo.Post_Date) > 5;
Kết quả (xóa 5 dòng, giữ 2 dòng gần nhất)
+----+-------+------------+
| Id | Name | Post_Date |
+----+-------+------------+
| 1 | Larry | 2019-03-11 |
| 3 | Sam | 2019-03-10 |
+----+-------+------------+
Cách tốt hơn cho hiệu năng (SARGable - dùng index)
DELETE FROM bang
WHERE cot_ngay < DATE_SUB(NOW(), INTERVAL 5 DAY)
LIMIT 1000;
-- Lặp lại cho đến khi rows affected = 0
Lưu ý
DATEDIFF bỏ qua phần giờ, chỉ so sánh ngày
- NOW() được evaluate 1 lần cho cả statement
- Luôn test với SELECT trước:
SELECT * FROM bang WHERE DATEDIFF(NOW(), cot) > 5 LIMIT 10;