Lọc bản ghi theo ngày (DATE) từ cột DATETIME trong MySQL
Khi cột lưu trữ kiểu DATETIME (có cả ngày và giờ), dùng hàm DATE() để trích xuất phần ngày rồi so sánh.
Ví dụ minh họa
Tạo bảng DemoTable732:
mysql> CREATE TABLE DemoTable732 (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
PassengerId INT,
PassengerName VARCHAR(100),
PassengerAge INT,
PassengerTravelDatetime DATETIME
);
Query OK, 0 rows affected (0.67 sec)
Chèn dữ liệu:
mysql> INSERT INTO DemoTable732(PassengerId,PassengerName,PassengerAge,PassengerTravelDatetime) VALUES(110,'Chris',25,'2019-07-23 12:45:56'); Query OK, 1 row affected (0.40 sec) mysql> INSERT INTO DemoTable732(PassengerId,PassengerName,PassengerAge,PassengerTravelDatetime) VALUES(120,'Robert',24,'2019-07-21 11:05:00'); Query OK, 1 row affected (0.11 sec) mysql> INSERT INTO DemoTable732(PassengerId,PassengerName,PassengerAge,PassengerTravelDatetime) VALUES(120,'Sam',26,'2019-07-21 11:05:00'); Query OK, 1 row affected (0.30 sec)
Xem dữ liệu:
mysql> SELECT * FROM DemoTable732;
+----+-------------+---------------+--------------+-------------------------+ | Id | PassengerId | PassengerName | PassengerAge | PassengerTravelDatetime | +----+-------------+---------------+--------------+-------------------------+ | 1 | 110 | Chris | 25 | 2019-07-23 12:45:56 | | 2 | 120 | Robert | 24 | 2019-07-21 11:05:00 | | 3 | 120 | Sam | 26 | 2019-07-21 11:05:00 | +----+-------------+---------------+--------------+-------------------------+ 3 rows in set (0.00 sec)
Đếm bản ghi có PassengerId=120 VÀ ngày đi là 2019-07-21:
mysql> SELECT COUNT(Id) FROM DemoTable732 WHERE PassengerId = 120 AND DATE(PassengerTravelDatetime) = '2019-07-21';
Kết quả:
+-----------+ | count(Id) | +-----------+ | 2 | +-----------+ 1 row in set (0.00 sec)
Giải thích
DATE(PassengerTravelDatetime): Trích xuất phần ngày (bỏ phần giờ) từ DATETIME- So sánh với chuỗi ngày
'2019-07-21'(định dạng chuẩn YYYY-MM-DD) - Kết hợp
ANDđể lọc cả PassengerId và ngày
⚠️ Cảnh báo hiệu suất quan trọng
Sử dụng hàm trên cột trong WHERE (DATE(col) = '...') sẽ không dùng được index trên cột đó.
Giải pháp tối ưu (SARGable)
-- Thay vì: WHERE DATE(datetime_col) = '2019-07-21' -- Dùng range: WHERE datetime_col >= '2019-07-21 00:00:00' AND datetime_col < '2019-07-22 00:00:00' -- Hoặc MySQL 8.0+: WHERE datetime_col >= '2019-07-21' AND datetime_col < '2019-07-21' + INTERVAL 1 DAY
Tóm tắt các hàm ngày liên quan
| Hàm | Chức năng | Ví dụ kết quả |
|---|---|---|
DATE() | Lấy phần ngày | 2019-07-21 |
TIME() | Lấy phần giờ | 11:05:00 |
YEAR() | Lấy năm | 2019 |
MONTH() | Lấy tháng | 7 |
DAY() | Lấy ngày | 21 |