- 1 1. Introduction
- 2 2. Các hàm MySQL để lấy ngày/giờ hiện tại (Bảng so sánh)
- 3 3. Chi tiết hàm NOW()
- 4 4. Đặc điểm của hàm SYSDATE()
- 5 5. CURTIME() và CURRENT_TIME()
- 6 6. Các ví dụ truy vấn thực tế sử dụng thời gian hiện tại
- 6.1 6.1 Ghi lại thời gian hiện tại khi chèn dữ liệu
- 6.2 6.2 Ghi lại thời gian hiện tại khi cập nhật dữ liệu
- 6.3 6.3 Lấy dữ liệu từ N ngày trước
- 6.4 6.4 Lấy dữ liệu được tạo trong một khoảng thời gian cụ thể
- 6.5 6.5 Lấy thời gian hiện tại có tính đến múi giờ
- 6.6 6.6 Đặt thời gian tạo bản ghi thành timestamp hiện tại theo mặc định
- 6.7 6.7 Xóa dữ liệu sau một khoảng thời gian nhất định
- 6.8 6.8 Lấy thời gian hiện tại với độ chính xác mili giây (microsecond)
- 6.9 6.9 Hướng dẫn lựa chọn trường hợp sử dụng
- 6.10 6.10 Tóm tắt
- 7 7. Câu hỏi thường gặp (FAQ)
- 7.1 7.1 Sự khác biệt giữa NOW() và SYSDATE() là gì?
- 7.2 7.2 CURRENT_TIMESTAMP() và NOW() có giống nhau không?
- 7.3 7.3 Làm thế nào để lấy thời gian hiện tại trong một múi giờ cụ thể?
- 7.4 7.4 Làm sao để tự động ghi lại thời gian hiện tại?
- 7.5 7.5 Làm sao để truy xuất dữ liệu trong N ngày qua?
- 7.6 7.6 Làm sao để lấy thời gian hiện tại với độ chính xác mili giây (micros giây)?
- 7.7 7.7 Tổng kết
- 8 8. Tổng kết
1. Introduction
Lấy thời gian hiện tại trong MySQL là một phần quan trọng của việc quản lý cơ sở dữ liệu.
Ví dụ, bạn có thể cần truy xuất thời gian hiện tại trong các tình huống như sau:
- Tự động ghi lại dấu thời gian tạo khi chèn dữ liệu (ví dụ, một dấu thời gian khi người dùng mới đăng ký)
- Ghi lại thời gian đăng nhập của người dùng (ví dụ, quản lý lịch sử đăng nhập)
- Truy xuất dữ liệu trong một khoảng thời gian nhất định (ví dụ, lấy lịch sử đơn hàng trong 24 giờ qua)
- Ghi lại nhật ký thực thi hệ thống (ví dụ, quản lý nhật ký lỗi và nhật ký sự kiện)
Như bạn thấy, việc truy xuất chính xác “thời gian hiện tại” cho quản lý dữ liệu và ghi nhật ký là thiết yếu cho việc vận hành cơ sở dữ liệu.
Trong bài viết này, chúng tôi sẽ giải thích cách lấy thời gian hiện tại trong MySQL một cách chi tiết bằng các truy vấn SQL thực tế.
Chúng tôi cũng sẽ đề cập đến sự khác nhau giữa các hàm thường dùng, cách chọn hàm phù hợp, và các ví dụ truy vấn thực tế—hữu ích cho người mới bắt đầu đến người dùng trung cấp.
2. Các hàm MySQL để lấy ngày/giờ hiện tại (Bảng so sánh)
MySQL cung cấp nhiều hàm để truy xuất thời gian hiện tại.
Việc chọn hàm phù hợp cho trường hợp sử dụng của bạn là quan trọng, nhưng nhiều người cảm thấy sự khác nhau giữa chúng gây nhầm lẫn.
Trong phần này, chúng tôi so sánh các hàm chính được sử dụng để lấy ngày/giờ hiện tại trong MySQL và giải thích chi tiết các đặc điểm của chúng.
2.1 Bảng so sánh các hàm thời gian MySQL
| Function | What it returns | Format | Notes |
|---|---|---|---|
| NOW() | Current date and time | YYYY-MM-DD HH:MM:SS | Most commonly used |
| SYSDATE() | Date and time at execution | YYYY-MM-DD HH:MM:SS | Unlike NOW(), it can change on each execution |
| CURTIME() | Current time | HH:MM:SS | Time only (no date) |
| CURRENT_TIME() | Current time | HH:MM:SS | Same as CURTIME() |
| CURRENT_TIMESTAMP() | Current date and time | YYYY-MM-DD HH:MM:SS | Almost the same as NOW() |
| UTC_TIMESTAMP() | Current UTC date and time | YYYY-MM-DD HH:MM:SS | Time zone is fixed to UTC |
Từ bảng trên, hầu hết các hàm trả về “ngày và giờ hiện tại” hoặc “giờ hiện tại”, nhưng hàm tốt nhất phụ thuộc vào mục đích của bạn.
2.2 Tổng quan và đặc điểm của từng hàm
Hàm NOW()
- Hàm phổ biến nhất để lấy ngày và giờ hiện tại
- Trả về thời gian tại thời điểm câu lệnh SQL bắt đầu
- Thường được sử dụng cho dấu thời gian khi chèn hoặc cập nhật dữ liệu
SELECT NOW();
Ví dụ đầu ra
2025-02-14 15:30:45
Hàm SYSDATE()
- Lấy thời gian hiện tại tại thời điểm thực thi
- Khác với NOW(), SYSDATE() có thể trả về giá trị khác nhau mỗi khi được đánh giá (nó có thể thay đổi ngay cả trong một giao dịch)
SELECT SYSDATE();
Ví dụ đầu ra
2025-02-14 15:30:47
Hàm CURTIME()
- Lấy chỉ thời gian (HH:MM:SS)
- Hữu ích khi không cần ngày
SELECT CURTIME();
Ví dụ đầu ra
15:30:45
Hàm CURRENT_TIME()
- Hoạt động giống như CURTIME()
- Tên hàm tuân thủ chuẩn SQL
SELECT CURRENT_TIME();
Ví dụ đầu ra
15:30:45
Hàm CURRENT_TIMESTAMP()
- Hoạt động giống như NOW()
- Có thể được chỉ định làm giá trị
DEFAULTcủa cột (thường phù hợp hơn so vớiNOW()cho giá trị mặc định)SELECT CURRENT_TIMESTAMP();
Ví dụ đầu ra
2025-02-14 15:30:45
Đặt làm giá trị mặc định khi tạo bảng:
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Hàm UTC_TIMESTAMP()
- Lấy thời gian UTC hiện tại (Coordinated Universal Time)
- Không phụ thuộc vào múi giờ máy chủ, cho phép dấu thời gian nhất quán
SELECT UTC_TIMESTAMP();
Ví dụ đầu ra
2025-02-14 06:30:45
2.3 Bạn nên sử dụng hàm nào?
| Use case | Recommended function |
|---|---|
| Get the current date and time | NOW() |
| Get a different timestamp each time within a transaction | SYSDATE() |
| Need only the current time (HH:MM:SS) | CURTIME() or CURRENT_TIME() |
| Set as a table default value | CURRENT_TIMESTAMP() |
| Get UTC time | UTC_TIMESTAMP() |
Nói chung, đối với việc truy xuất ngày/giờ thông thường, NOW() thường là lựa chọn phù hợp.
Tuy nhiên, việc chọn hàm tốt nhất cho trường hợp sử dụng của bạn cho phép các hoạt động dữ liệu linh hoạt và đáng tin cậy hơn.
3. Chi tiết hàm NOW()
Hàm MySQL NOW() là hàm được sử dụng phổ biến nhất để lấy ngày và giờ hiện tại (ngày + giờ).
Nó được sử dụng rộng rãi để lưu dấu thời gian trong cơ sở dữ liệu và truy xuất dữ liệu trong các khoảng thời gian cụ thể.
3.1 Cách sử dụng cơ bản của NOW()
Cú pháp của NOW()
SELECT NOW();
Ví dụ đầu ra
2025-02-14 15:30:45
- Định dạng đầu ra là
YYYY-MM-DD HH:MM:SS(năm-tháng-ngày giờ:phút:giây). - Thời gian được lấy dựa trên cài đặt múi giờ mặc định của MySQL.
3.2 Các trường hợp sử dụng phổ biến cho NOW()
① Ghi lại thời gian hiện tại khi chèn dữ liệu
Khi chèn dữ liệu vào cơ sở dữ liệu, bạn có thể sử dụng NOW() để ghi lại dấu thời gian tạo.
INSERT INTO users (name, created_at) VALUES ('Sato', NOW());
② Ghi lại thời gian hiện tại khi cập nhật dữ liệu
UPDATE users SET last_login = NOW() WHERE id = 1;
③ Truy xuất dữ liệu trong một khoảng thời gian nhất định
SELECT * FROM orders WHERE order_date >= NOW() - INTERVAL 1 DAY;
- Bằng cách chỉ định
INTERVAL 1 DAY, bạn có thể truy xuất “dữ liệu trong 1 ngày qua”.
3.3 Kiểu trả về và Cách thay đổi định dạng đầu ra
Kiểu trả về của NOW()
- Kiểu
DATETIME(YYYY-MM-DD HH:MM:SS) - Nó cũng có thể được coi là một chuỗi
SELECT NOW(), typeof(NOW());
Cách thay đổi định dạng
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS formatted_time;
Ví dụ đầu ra
2025-02-14 15:30:45
3.4 Sự khác biệt giữa NOW() và SYSDATE()
| Function | When it’s evaluated | Notes |
|---|---|---|
| NOW() | At query start | Returns a fixed timestamp for the statement |
| SYSDATE() | At execution time | Can return different timestamps within the same statement |
SELECT NOW(), SLEEP(3), NOW();
SELECT SYSDATE(), SLEEP(3), SYSDATE();
Ví dụ đầu ra
NOW() | SLEEP(3) | NOW()
2025-02-14 15:30:45 | wait 3 seconds | 2025-02-14 15:30:45
SYSDATE() | SLEEP(3) | SYSDATE()
2025-02-14 15:30:45 | wait 3 seconds | 2025-02-14 15:30:48
🚨 Nếu bạn đang làm việc với các giao dịch, NOW() được khuyến nghị để duy trì tính nhất quán.
3.5 Các hạn chế và lưu ý cho NOW()
① Phụ thuộc vào múi giờ
SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo');
② Đối với giá trị mặc định của bảng, sử dụng CURRENT_TIMESTAMP
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
3.6 Tóm tắt về NOW()
NOW()là hàm phổ biến nhất để lấy ngày và giờ hiện tại trong MySQL.- Nó có thể được sử dụng cho chèn, cập nhật và truy xuất dữ liệu dựa trên thời gian.
- Sử dụng
NOW()khi bạn cần một dấu thời gian nhất quán trong một giao dịch. SYSDATE()trả về thời gian khác nhau ở mỗi lần đánh giá, vì vậy hãy sử dụng nó khi bạn cần thời gian thực thi chính xác.- Sử dụng
CONVERT_TZ()để lấy thời gian ở múi giờ khác.
📌 Kết luận: Trong hầu hết các trường hợp, NOW() là lựa chọn tốt nhất để lấy ngày và giờ hiện tại trong MySQL.

4. Đặc điểm của hàm SYSDATE()
Hàm SYSDATE() là một cách khác để lấy ngày và giờ hiện tại trong MySQL, nhưng nó hoạt động khác với NOW().
Trong phần này, chúng tôi sẽ giải thích cách sử dụng cơ bản của SYSDATE(), cách nó khác với NOW(), và các lưu ý quan trọng.
4.1 SYSDATE() là gì?
SYSDATE() là một hàm trả về thời gian tại thời điểm thực thi câu lệnh.
Khác với NOW(), nó trả về một dấu thời gian khác nhau mỗi khi được đánh giá.
Cú pháp SYSDATE()
SELECT SYSDATE();
Ví dụ đầu ra
2025-02-14 16:00:45
- Trả về ở định dạng
YYYY-MM-DD HH:MM:SS - Đại diện cho thời điểm truy vấn được thực thi
4.2 Sự khác biệt giữa SYSDATE() và NOW()
| Function | When it’s evaluated | Notes |
|---|---|---|
| NOW() | At query start | Returns a fixed timestamp for the statement |
| SYSDATE() | At execution time | Returns a different timestamp each time |
So sánh hành vi: NOW() vs SYSDATE()
SELECT NOW(), SLEEP(3), NOW();
SELECT SYSDATE(), SLEEP(3), SYSDATE();
Ví dụ đầu ra
NOW() | SLEEP(3) | NOW()
2025-02-14 16:00:45 | wait 3 seconds | 2025-02-14 16:00:45
SYSDATE() | SLEEP(3) | SYSDATE()
2025-02-14 16:00:45 | wait 3 seconds | 2025-02-14 16:00:48
📌 Các điểm chính
NOW()giữ dấu thời gian từ lúc bắt đầu câu lệnh, vì vậy nó không thay đổi.SYSDATE()trả về một dấu thời gian khác nhau mỗi khi được đánh giá, vì vậy nó thay đổi sau 3 giây.
🚨 Sử dụng NOW() cho xử lý giao dịch
- Vì
SYSDATE()có thể hoạt động khác vớiNOW()trong môi trường đa luồng,NOW()thường được khuyến nghị để duy trì tính nhất quán giao dịch.
4.3 Ví dụ về việc sử dụng SYSDATE()
① Ghi lại thời gian hiện tại khi chèn dữ liệu
INSERT INTO logs (event, created_at) VALUES ('User login', SYSDATE());
② Ghi lại thời gian hiện tại khi cập nhật dữ liệu
UPDATE users SET last_login = SYSDATE() WHERE id = 1;
③ Lấy thời gian hiện tại theo định dạng cụ thể
SELECT DATE_FORMAT(SYSDATE(), '%Y-%m-%d %H:%i:%s') AS formatted_time;
Kết quả mẫu
2025-02-14 16:05:30
4.4 Giới hạn và Lưu ý cho SYSDATE()
① Hành vi giao dịch
NOW()giữ dấu thời gian từ lúc bắt đầu câu lệnh, vì vậy có thể sử dụng một cách nhất quán trong một giao dịch.SYSDATE()trả về một dấu thời gian khác nhau mỗi lần, do đó có thể xảy ra trôi thời gian trong cùng một giao dịch.
② Không thể dùng làm giá trị DEFAULT
SYSDATE()không thể được đặt làm giá trịDEFAULTcủa cột bảng.
✅ Giải pháp: Sử dụng DEFAULT CURRENT_TIMESTAMP.
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
4.5 Khi nào nên dùng SYSDATE()?
| Use case | Recommended function |
|---|---|
| Typical current timestamp retrieval | NOW() |
| Use a consistent timestamp within a transaction | NOW() |
| Need the exact execution time | SYSDATE() |
🚀 SYSDATE() phù hợp cho việc ghi log thời gian thực, nhưng không lý tưởng cho xử lý giao dịch.
4.6 Tóm tắt về SYSDATE()
- SYSDATE() lấy dấu thời gian tại thời điểm thực thi, khác với
NOW(). - Vì có thể trả về các giá trị khác nhau mỗi lần, nó hữu ích cho việc ghi log thời gian thực.
- Đối với tính nhất quán trong giao dịch, nên dùng
NOW(). - Đối với giá trị mặc định, sử dụng
CURRENT_TIMESTAMP.
📌 Kết luận: Đối với việc lấy dấu thời gian chung, NOW() là tốt nhất; đối với thời gian thực thi chính xác, chọn SYSDATE().
5. CURTIME() và CURRENT_TIME()
Khi bạn muốn lấy thời gian hiện tại trong MySQL, CURTIME() và CURRENT_TIME() được sử dụng khi bạn chỉ cần thời gian (HH:MM:SS).
Trong phần này, chúng tôi sẽ giải thích cách sử dụng cơ bản, sự khác nhau và các ví dụ thực tế cho từng hàm.
5.1 CURTIME() là gì?
CURTIME() là một hàm lấy thời gian hiện tại (giờ, phút, giây) trong MySQL.
Đặc điểm chính của nó là không bao gồm ngày—chỉ trả về phần thời gian.
Cú pháp CURTIME()
SELECT CURTIME();
Kết quả mẫu
16:30:45
- Định dạng:
HH:MM:SS - Phụ thuộc vào cài đặt múi giờ của máy chủ
- Không giống như
NOW(), nó phù hợp khi bạn không cần thông tin ngày tháng
5.2 CURRENT_TIME() là gì?
CURRENT_TIME(), giống như CURTIME(), là một hàm lấy thời gian hiện tại (HH:MM:SS).
Trong thực tế, nó hoạt động đúng như CURTIME().
Cú pháp CURRENT_TIME()
SELECT CURRENT_TIME();
Kết quả mẫu
16:30:45
📌 Sự khác nhau là gì?
CURTIME()là hàm riêng của MySQLCURRENT_TIME()là chuẩn SQL- Chúng hoạt động giống nhau
- Chọn dựa trên sở thích đọc (không có sự khác biệt về hiệu năng)
5.3 So sánh CURTIME() vs CURRENT_TIME()
| Function | What it returns | Format | Notes |
|---|---|---|---|
| CURTIME() | Current time (hour/minute/second) | HH:MM:SS | MySQL-specific function |
| CURRENT_TIME() | Current time (hour/minute/second) | HH:MM:SS | SQL-standard function |
5.4 Ví dụ thực tế của CURTIME() / CURRENT_TIME()
① Ghi lại thời gian hiện tại khi chèn dữ liệu
INSERT INTO user_logs (event, event_time) VALUES ('Login', CURTIME());
② Lọc (lấy dữ liệu trong một khoảng thời gian cụ thể)
SELECT * FROM logs WHERE TIME(created_at) BETWEEN '09:00:00' AND '18:00:00';
③ Thay đổi độ chính xác (bao gồm mili giây)
SELECT CURTIME(3); -- Display up to 3 fractional digits
Kết quả mẫu
16:30:45.123
5.5 Giới hạn và Lưu ý cho CURTIME() / CURRENT_TIME()
① Không có thông tin ngày, vì vậy cần kết hợp với ngày khi cần
SELECT CONCAT(CURDATE(), ' ', CURTIME()) AS full_datetime;
② Khi dùng làm giá trị DEFAULT
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event_time TIME DEFAULT CURTIME()
);
5.6 Khi nào nên dùng CURTIME() / CURRENT_TIME()?
| Use case | Recommended function |
|---|---|
| Need only the current time (hour/minute/second) | CURTIME() or CURRENT_TIME() |
| Need current date and time | NOW() |
| Need millisecond precision | CURTIME(3) |
📌 Trong hầu hết các trường hợp, cả CURTIME() và CURRENT_TIME() đều hoạt động tốt.
Chọn bất kỳ cái nào bạn thấy dễ đọc hơn.
5.7 Tóm tắt CURTIME() / CURRENT_TIME()
CURTIME()là riêng của MySQL;CURRENT_TIME()là tiêu chuẩn SQL- Cả hai đều lấy thời gian hiện tại (HH:MM:SS)
- Sử dụng
CURTIME(3)hoặcDATE_FORMAT()để điều chỉnh định dạng/độ chính xác - Nếu bạn cần ngày, kết hợp với
CURDATE()hoặc dùngNOW() - Đối với giá trị mặc định, thường dùng
CURRENT_TIMESTAMP
📌 Kết luận: Nếu bạn chỉ cần thời gian hiện tại, CURTIME() là một lựa chọn ổn.
6. Các ví dụ truy vấn thực tế sử dụng thời gian hiện tại
Bây giờ bạn đã hiểu cách lấy thời gian hiện tại trong MySQL, hãy xem các cách thực tế để sử dụng nó.
Trong phần này, chúng tôi sẽ giới thiệu các ví dụ truy vấn thực tế sử dụng thời gian hiện tại.
Bạn sẽ học các kỹ thuật hữu ích cho các công việc hàng ngày với cơ sở dữ liệu như chèn, cập nhật và tìm kiếm.
6.1 Ghi lại thời gian hiện tại khi chèn dữ liệu
① Ghi lại thời gian hiện tại khi người dùng đăng ký
INSERT INTO users (name, email, created_at)
VALUES ('Sato', 'sato@example.com', NOW());
6.2 Ghi lại thời gian hiện tại khi cập nhật dữ liệu
② Ghi lại dấu thời gian đăng nhập cuối cùng của người dùng
UPDATE users SET last_login = NOW() WHERE id = 1;
6.3 Lấy dữ liệu từ N ngày trước
③ Lấy dữ liệu đơn hàng trong 7 ngày qua
SELECT * FROM orders WHERE order_date >= NOW() - INTERVAL 7 DAY;
6.4 Lấy dữ liệu được tạo trong một khoảng thời gian cụ thể
④ Lấy dữ liệu được tạo hôm nay trong khoảng từ 9:00 sáng đến 6:00 chiều
SELECT * FROM logs WHERE TIME(created_at) BETWEEN '09:00:00' AND '18:00:00';
6.5 Lấy thời gian hiện tại có tính đến múi giờ
⑤ Chuyển thời gian UTC sang thời gian Nhật Bản (JST)
SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo');
6.6 Đặt thời gian tạo bản ghi thành timestamp hiện tại theo mặc định
⑥ Tự động đặt created_at thành timestamp hiện tại
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
6.7 Xóa dữ liệu sau một khoảng thời gian nhất định
⑦ Xóa dữ liệu cũ hơn 30 ngày
DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY;
6.8 Lấy thời gian hiện tại với độ chính xác mili giây (microsecond)
⑧ Lấy timestamp hiện tại với độ chính xác mili giây
SELECT NOW(3);
Ví dụ đầu ra
2025-02-14 16:30:45.123
6.9 Hướng dẫn lựa chọn trường hợp sử dụng
| Use case | Recommended function | Example |
|---|---|---|
| Record the current time when inserting data | NOW() | INSERT INTO users (name, created_at) VALUES ('Sato', NOW()); |
| Record the current time when updating data | NOW() | UPDATE users SET last_login = NOW() WHERE id = 1; |
| Retrieve data from the past N days | NOW() - INTERVAL X DAY | SELECT * FROM orders WHERE order_date >= NOW() - INTERVAL 7 DAY; |
| Retrieve data within a specific time range | CURTIME() | SELECT * FROM logs WHERE TIME(created_at) BETWEEN '09:00:00' AND '18:00:00'; |
| Convert UTC time to JST | CONVERT_TZ() | SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo'); |
| Delete old data (older than 30 days) | NOW() - INTERVAL X DAY | DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY; |
6.10 Tóm tắt
NOW()xử lý việc lấy timestamp hiện tại cơ bảnCURTIME()vàCURRENT_TIME()hữu ích khi bạn chỉ cần thời gian- Bạn có thể sử dụng thời gian hiện tại cho các truy vấn cửa sổ thời gian, lọc theo thời gian trong ngày và timestamp có độ chính xác mili giây
- Vì timestamp phụ thuộc vào múi giờ, hãy sử dụng
CONVERT_TZ()để lấy thời gian chính xác - Đối với quản lý kích thước cơ sở dữ liệu, việc thiết kế cơ chế tự động xóa dữ liệu cũ cũng rất quan trọng
📌 Kết luận: Sử dụng thời gian hiện tại một cách hiệu quả giúp bạn quản lý dữ liệu trong MySQL hiệu quả hơn.
7. Câu hỏi thường gặp (FAQ)
Dưới đây là các câu hỏi thường gặp (FAQ) về cách lấy thời gian hiện tại trong MySQL.
Mỗi câu hỏi được trả lời một cách rõ ràng và ngắn gọn.
7.1 Sự khác biệt giữa NOW() và SYSDATE() là gì?
Trả lời
Cả NOW() và SYSDATE() đều lấy ngày và thời gian hiện tại, nhưng chúng khác nhau ở thời điểm giá trị được đánh giá.
| Function | When it’s evaluated | Notes |
|---|---|---|
| NOW() | At query start | Returns a fixed timestamp for the statement |
| SYSDATE() | At execution time | Returns a different timestamp on each evaluation |
Ví dụ kiểm tra
SELECT NOW(), SLEEP(3), NOW();
SELECT SYSDATE(), SLEEP(3), SYSDATE();
Ví dụ đầu ra
NOW() | SLEEP(3) | NOW()
2025-02-14 16:30:45 | wait 3 seconds | 2025-02-14 16:30:45
SYSDATE() | SLEEP(3) | SYSDATE()
2025-02-14 16:30:45 | wait 3 seconds | 2025-02-14 16:30:48
🚨 Đối với xử lý giao dịch, thường khuyến nghị sử dụng NOW().
7.2 CURRENT_TIMESTAMP() và NOW() có giống nhau không?
Trả lời
Chúng hoạt động gần như giống nhau, nhưng CURRENT_TIMESTAMP() có thể được dùng làm giá trị DEFAULT.
Ví dụ khi tạo bảng
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
7.3 Làm thế nào để lấy thời gian hiện tại trong một múi giờ cụ thể?
Trả lời
SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo');
7.4 Làm sao để tự động ghi lại thời gian hiện tại?
Trả lời
Khi tạo bảng, chỉ định DEFAULT CURRENT_TIMESTAMP để tự động lưu thời gian hiện tại vào cột created_at.
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
7.5 Làm sao để truy xuất dữ liệu trong N ngày qua?
Trả lời
SELECT * FROM orders WHERE order_date >= NOW() - INTERVAL 7 DAY;
7.6 Làm sao để lấy thời gian hiện tại với độ chính xác mili giây (micros giây)?
Trả lời
SELECT NOW(3);
Ví dụ đầu ra
2025-02-14 16:30:45.123
7.7 Tổng kết
NOW()vàSYSDATE()khác nhau về thời điểm đánh giáCURRENT_TIMESTAMP()có thể được dùng làm giá trịDEFAULT- Sử dụng
CONVERT_TZ()để lấy timestamp ở các múi giờ khác - Dùng
DEFAULT CURRENT_TIMESTAMPđể tự động ghi lại thời gian tạo - Dùng
NOW() - INTERVAL X DAYđể truy xuất dữ liệu trong X ngày qua NOW(3)hoặcNOW(6)hỗ trợ timestamp với độ chính xác mili giây/micro giây
📌 Kết luận: Lựa chọn hàm thời gian MySQL phù hợp là yếu tố then chốt khi làm việc với các timestamp hiện tại.
8. Tổng kết
Trong bài viết này, chúng tôi đã giải thích cách lấy thời gian hiện tại trong MySQL.
Tập trung vào hàm NOW(), chúng tôi đã đề cập đến sự khác nhau giữa các hàm tương tự, đưa ra các ví dụ truy vấn thực tế và lưu ý quan trọng.
8.1 Các hàm MySQL chính để lấy thời gian hiện tại
| Function | What it returns | Format | Notes |
|---|---|---|---|
| NOW() | Current date and time | YYYY-MM-DD HH:MM:SS | Most common function |
| SYSDATE() | Date and time at execution | YYYY-MM-DD HH:MM:SS | Can return different values on each evaluation |
| CURTIME() | Current time | HH:MM:SS | Time only (no date) |
| CURRENT_TIME() | Current time | HH:MM:SS | Same as CURTIME() |
| CURRENT_TIMESTAMP() | Current date and time | YYYY-MM-DD HH:MM:SS | Almost the same as NOW() |
| UTC_TIMESTAMP() | Current UTC date and time | YYYY-MM-DD HH:MM:SS | Time zone fixed to UTC |
📌 Kết luận:
- Đối với việc lấy timestamp hiện tại chung, thường thì
NOW()là lựa chọn tốt nhất. - Nếu bạn cần thời gian thực thi chính xác, hãy dùng
SYSDATE(). - Nếu chỉ cần thời gian (không có ngày), chọn
CURTIME().
8.2 Các truy vấn thực tế sử dụng thời gian hiện tại
Ghi lại thời gian hiện tại khi chèn dữ liệu
INSERT INTO users (name, created_at) VALUES ('Sato', NOW());
Ghi lại thời gian hiện tại khi cập nhật dữ liệu
UPDATE users SET last_login = NOW() WHERE id = 1;
Truy xuất dữ liệu trong 7 ngày qua
SELECT * FROM orders WHERE order_date >= NOW() - INTERVAL 7 DAY;
Lấy thời gian có tính đến múi giờ
SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo');
Xóa dữ liệu cũ (cũ hơn 30 ngày)
DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY;
8.3 Lưu ý về múi giờ
NOW()của MySQL phụ thuộc vào cài đặt múi giờ mặc định, vì vậy kết quả có thể khác nhau giữa các môi trường.- Sử dụng
CONVERT_TZ()để lấy timestamp ở một múi giờ khác. - Nếu muốn thay đổi múi giờ của máy chủ:
SET GLOBAL time_zone = 'Asia/Tokyo';
8.4 Câu hỏi thường gặp về các hàm thời gian hiện tại của MySQL
Q1. Sự khác nhau giữa NOW() và SYSDATE() là gì?
➡ NOW() lấy thời gian khi bắt đầu truy vấn, trong khi SYSDATE() lấy thời gian khi thực thi.
Q2. CURRENT_TIMESTAMP() và NOW() có giống nhau không?
➡ Chúng gần như giống nhau, nhưng CURRENT_TIMESTAMP() có thể được dùng làm giá trị DEFAULT.
Q3. Làm sao để lấy thời gian hiện tại với độ chính xác mili giây (micros giây)?
➡ Sử dụng NOW(3) (mili giây) hoặc NOW(6) (micros giây).
SELECT NOW(3); -- Example: 2025-02-14 16:30:45.123
8.5 Tổng kết
- Trong MySQL, việc chọn hàm đúng cho thời gian hiện tại là quan trọng .
- Sử dụng
NOW()cho các trường hợp thông thường, vàSYSDATE()khi bạn cần dấu thời gian thực thi chính xác . - Sử dụng
CURTIME()chỉ cho thời gian, vàCONVERT_TZ()để chuyển đổi múi giờ . - Bạn có thể sử dụng thời gian hiện tại trong các thao tác chèn, cập nhật, tìm kiếm và xóa .
📌 Kết luận: Thành thạo các hàm thời gian của MySQL để quản lý dữ liệu hiệu quả hơn.


