Giới thiệu
Khi bảng chứa cột DATE/DATETIME có giá trị NULL, việc lọc ngày cần xử lý riêng cho NULL để tránh bị loại bỏ sai bản ghi.
Ví dụ minh họa
Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
FirstDate DATETIME,
SecondDate DATETIME
);
mysql> INSERT INTO DemoTable VALUES
('2019-01-21', '2018-01-21'),
('2019-10-04', '2019-08-14'),
('2019-05-01', '2019-09-11'),
(NULL, NULL),
('2019-03-01', NULL);
Xem dữ liệu
+---------------------+---------------------+ | FirstDate | SecondDate | +---------------------+---------------------+ | 2019-01-21 00:00:00 | 2018-01-21 00:00:00 | | 2019-10-04 00:00:00 | 2019-08-14 00:00:00 | | 2019-05-01 00:00:00 | 2019-09-11 00:00:00 | | NULL | NULL | | 2019-03-01 00:00:00 | NULL | +---------------------+---------------------+
Truy vấn lọc: FirstDate <= hôm nay AND (SecondDate >= hôm nay OR SecondDate IS NULL)
mysql> SELECT * FROM DemoTable WHERE FirstDate <= CURDATE() AND (SecondDate >= CURDATE() OR SecondDate IS NULL);
Kết quả (giả sử hôm nay 2019-08-15)
+---------------------+---------------------+ | FirstDate | SecondDate | +---------------------+---------------------+ | 2019-05-01 00:00:00 | 2019-09-11 00:00:00 | | 2019-03-01 00:00:00 | NULL | +---------------------+---------------------+
Giải thích logic
FirstDate <= CURDATE(): Ngày bắt đầu đã qua hoặc là hôm nay.SecondDate >= CURDATE(): Ngày kết thúc chưa qua hoặc là hôm nay.OR SecondDate IS NULL: Nếu không có ngày kết thúc (NULL), coi như vẫn hiệu lực.
Lưu ý
- Luôn dùng
IS NULL/IS NOT NULLthay vì= NULL/!= NULL. - Nếu cột là DATE, so sánh trực tiếp với CURDATE(). Nếu DATETIME, cân nhắc dùng
DATE(SecondDate) >= CURDATE().