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

Truy vấn MySQL lấy bản ghi có ngày bằng hôm nay (CURDATE)


Sử dụng CURDATE() lấy ngày hiện tại (không có giờ), kết hợp DATE() để so sánh chỉ phần ngày của cột DATETIME.

Cú pháp

SELECT column1, column2, DATE_FORMAT(date_column, '%Y-%m-%d') AS date_only
FROM table_name
WHERE DATE(date_column) = CURDATE();

Ví dụ minh họa

mysql> CREATE TABLE GmailSignIn (
  UserId INT, UserName VARCHAR(200), DateOfSignIn DATETIME
);
Query OK, 0 rows affected (1.56 sec)

-- Giả sử hôm nay là 2018-12-06
mysql> INSERT INTO GmailSignIn VALUES
(222111, 'John', NOW()),
(333222, 'Johnson', CURDATE()),
(444333, 'Carol', DATE_ADD(CURDATE(), INTERVAL 1 DAY)),
(555444, 'David', DATE_ADD(CURDATE(), INTERVAL -1 DAY));
Query OK, 4 rows affected

Truy vấn bản ghi hôm nay:

mysql> SELECT UserId, UserName, DateOfSignIn, 
       DATE_FORMAT(DateOfSignIn, '%Y-%m-%d') AS SignInDate
FROM GmailSignIn
WHERE DATE(DateOfSignIn) = CURDATE();

Kết quả:

+--------+----------+---------------------+-------------+
| UserId | UserName | DateOfSignIn        | SignInDate  |
+--------+----------+---------------------+-------------+
| 222111 | John     | 2018-12-06 19:13:30 | 2018-12-06  |
| 333222 | Johnson  | 2018-12-06 00:00:00 | 2018-12-06  |
+--------+----------+---------------------+-------------+

Lưu ý hiệu năng

DATE(date_column) = CURDATE() không dùng được index trên cột date_column.

Cách tối ưu (SARGable):

WHERE date_column >= CURDATE() 
  AND date_column < DATE_ADD(CURDATE(), INTERVAL 1 DAY)

Cách này tận dụng index và tránh hàm trên cột.