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

Xóa bản ghi cũ hơn 5 ngày trong MySQL

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;