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

Làm thế nào để lấy bản ghi hôm nay từ cột DATETIME bằng DATE()?

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ácDùng index?Ghi chú
DATE(col) = CURDATE()Chính xácKhông (function trên cột)Dễ hiểu
col >= CURDATE() AND col < CURDATE()+1Chính xácCó (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.