MySQL Timestamp Hiện Tại: Cách Lấy Ngày và Giờ Hiện Tại (NOW, SYSDATE, UTC_TIMESTAMP)

目次

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

FunctionWhat it returnsFormatNotes
NOW()Current date and timeYYYY-MM-DD HH:MM:SSMost commonly used
SYSDATE()Date and time at executionYYYY-MM-DD HH:MM:SSUnlike NOW(), it can change on each execution
CURTIME()Current timeHH:MM:SSTime only (no date)
CURRENT_TIME()Current timeHH:MM:SSSame as CURTIME()
CURRENT_TIMESTAMP()Current date and timeYYYY-MM-DD HH:MM:SSAlmost the same as NOW()
UTC_TIMESTAMP()Current UTC date and timeYYYY-MM-DD HH:MM:SSTime 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ị DEFAULT của cột (thường phù hợp hơn so với NOW() 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 caseRecommended function
Get the current date and timeNOW()
Get a different timestamp each time within a transactionSYSDATE()
Need only the current time (HH:MM:SS)CURTIME() or CURRENT_TIME()
Set as a table default valueCURRENT_TIMESTAMP()
Get UTC timeUTC_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()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()

FunctionWhen it’s evaluatedNotes
NOW()At query startReturns a fixed timestamp for the statement
SYSDATE()At execution timeCan 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()

FunctionWhen it’s evaluatedNotes
NOW()At query startReturns a fixed timestamp for the statement
SYSDATE()At execution timeReturns 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

  • SYSDATE() có thể hoạt động khác với NOW() 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ị DEFAULT củ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 caseRecommended function
Typical current timestamp retrievalNOW()
Use a consistent timestamp within a transactionNOW()
Need the exact execution timeSYSDATE()

🚀 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()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 MySQL
  • CURRENT_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()

FunctionWhat it returnsFormatNotes
CURTIME()Current time (hour/minute/second)HH:MM:SSMySQL-specific function
CURRENT_TIME()Current time (hour/minute/second)HH:MM:SSSQL-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 caseRecommended function
Need only the current time (hour/minute/second)CURTIME() or CURRENT_TIME()
Need current date and timeNOW()
Need millisecond precisionCURTIME(3)

📌 Trong hầu hết các trường hợp, cả CURTIME()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ặc DATE_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ùng NOW()
  • Đố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 caseRecommended functionExample
Record the current time when inserting dataNOW()INSERT INTO users (name, created_at) VALUES ('Sato', NOW());
Record the current time when updating dataNOW()UPDATE users SET last_login = NOW() WHERE id = 1;
Retrieve data from the past N daysNOW() - INTERVAL X DAYSELECT * FROM orders WHERE order_date >= NOW() - INTERVAL 7 DAY;
Retrieve data within a specific time rangeCURTIME()SELECT * FROM logs WHERE TIME(created_at) BETWEEN '09:00:00' AND '18:00:00';
Convert UTC time to JSTCONVERT_TZ()SELECT CONVERT_TZ(NOW(), 'UTC', 'Asia/Tokyo');
Delete old data (older than 30 days)NOW() - INTERVAL X DAYDELETE 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ản
  • CURTIME()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()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á.

FunctionWhen it’s evaluatedNotes
NOW()At query startReturns a fixed timestamp for the statement
SYSDATE()At execution timeReturns 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()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()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ặc NOW(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

FunctionWhat it returnsFormatNotes
NOW()Current date and timeYYYY-MM-DD HH:MM:SSMost common function
SYSDATE()Date and time at executionYYYY-MM-DD HH:MM:SSCan return different values on each evaluation
CURTIME()Current timeHH:MM:SSTime only (no date)
CURRENT_TIME()Current timeHH:MM:SSSame as CURTIME()
CURRENT_TIMESTAMP()Current date and timeYYYY-MM-DD HH:MM:SSAlmost the same as NOW()
UTC_TIMESTAMP()Current UTC date and timeYYYY-MM-DD HH:MM:SSTime 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()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()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.