Sử dụng DATE() để trích xuất phần ngày từ DATETIME, so sánh với CURDATE().
Tạo bảng có cột DATETIME
mysql> CREATE TABLE DemoTable (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ShippingDate DATETIME
-> );
Chèn dữ liệu
mysql> INSERT INTO DemoTable(ShippingDate) VALUES('2019-03-01 05:45:32');
mysql> INSERT INTO DemoTable(ShippingDate) VALUES('2019-04-13 11:34:56');
mysql> INSERT INTO DemoTable(ShippingDate) VALUES('2019-03-15 04:45:23');
mysql> INSERT INTO DemoTable(ShippingDate) VALUES('2019-04-11 12:10:02');
Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+----+---------------------+ | Id | ShippingDate | +----+---------------------+ | 1 | 2019-03-01 05:45:32 | | 2 | 2019-04-13 11:34:56 | | 3 | 2019-03-15 04:45:23 | | 4 | 2019-04-11 12:10:02 | +----+---------------------+
Lấy bản ghi hôm nay (giả sử hôm nay 2019-04-13)
mysql> SELECT * FROM DemoTable WHERE DATE(ShippingDate) = CURDATE();
+----+---------------------+ | Id | ShippingDate | +----+---------------------+ | 2 | 2019-04-13 11:34:56 | +----+---------------------+
Phương pháp gốc trong ví dụ: date_sub
SELECT * FROM DemoTable WHERE ShippingDate > DATE_SUB(CURDATE(), INTERVAL 1 DAY);
Lấy các hàng có ShippingDate > (hôm qua 00:00:00) — bao gồm hôm nay và tương lai. Không chính xác cho "hôm nay".
So sánh các phương pháp
| Phương pháp | Độ chính xác | Dùng index? | Ghi chú |
|---|---|---|---|
DATE(col) = CURDATE() | Chính xác | Không (function trên cột) | Dễ hiểu |
col >= CURDATE() AND col < CURDATE()+1 | Chính xác | Có (range query) | Hiệu năng tốt nhất |
col > DATE_SUB(CURDATE(), INTERVAL 1 DAY) | Sai (lấy > hôm qua) | Có | Không khuyến khích |
Best practice cho bảng lớn
SELECT * FROM DemoTable WHERE ShippingDate >= CURDATE() AND ShippingDate < DATE_ADD(CURDATE(), INTERVAL 1 DAY);
Sử dụng range query cho phép index trên ShippingDate hoạt động.