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

Tìm kiếm bản ghi theo ngày trong MySQL?

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àmChức năngVí dụ kết quả
DATE()Lấy phần ngày2019-07-21
TIME()Lấy phần giờ11:05:00
YEAR()Lấy năm2019
MONTH()Lấy tháng7
DAY()Lấy ngày21