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

Lọc ngày từ bảng có cột DATE và NULL trong MySQL


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 NULL thay 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().