UPDATE đặt cờ trạng thái dựa trên so sánh ngày với CURDATE()
Sử dụng UPDATE ... SET flag = 1 WHERE expiry_date <= CURDATE() để đánh dấu các bản ghi đã quá hạn (ngày hết hạn ≤ hôm nay).
1. Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
ProductStatus TINYINT(1),
ProductExpiryDate DATE
);
Giả sử ngày hiện tại: 2019-08-20
mysql> INSERT INTO DemoTable VALUES
(0, '2019-06-12'), (0, '2019-10-11'), (0, '2018-07-24'), (0, '2018-09-05');
2. Xem dữ liệu ban đầu
mysql> SELECT * FROM DemoTable;
+---------------+-------------------+ | ProductStatus | ProductExpiryDate | +---------------+-------------------+ | 0 | 2019-06-12 | ← quá hạn | 0 | 2019-10-11 | ← chưa hết hạn | 0 | 2018-07-24 | ← quá hạn | 0 | 2018-09-05 | ← quá hạn +---------------+-------------------+
3. Truy vấn: Cập nhật ProductStatus = 1 cho hàng quá hạn
mysql> UPDATE DemoTable
SET ProductStatus = 1
WHERE ProductExpiryDate <= CURDATE();
Kết quả: Query OK, 3 rows affected
4. Kiểm tra kết quả
mysql> SELECT * FROM DemoTable;
+---------------+-------------------+ | ProductStatus | ProductExpiryDate | +---------------+-------------------+ | 1 | 2019-06-12 | | 0 | 2019-10-11 | | 1 | 2018-07-24 | | 1 | 2018-09-05 | +---------------+-------------------+
Giải thích:
CURDATE()= '2019-08-20' (ngày hiện tại)- 3 hàng có ExpiryDate ≤ '2019-08-20' → Status = 1
- 1 hàng ExpiryDate = '2019-10-11' > '2019-08-20' → Status giữ 0
Ứng dụng thực tế:
- Hệ thống subscription: Đánh dấu gói đã hết hạn
- Quản lý kho: Đánh dấu hàng hóa quá hạn sử dụng
- Task management: Đánh dấu task overdue
- Chạy định kỳ (Event Scheduler / Cron job) mỗi ngày
MySQL Event tự động chạy hàng ngày:
CREATE EVENT update_expired_status ON SCHEDULE EVERY 1 DAY DO UPDATE DemoTable SET ProductStatus = 1 WHERE ProductExpiryDate <= CURDATE();