- 1 1. MySQL TIMESTAMP là gì?
- 2 2. Cách sử dụng cơ bản của TIMESTAMP
- 3 3. Làm việc với TIMESTAMP và múi giờ
- 4 4. Vấn đề Năm 2038 và tác động của nó
- 5 5. Các Trường Hợp Sử Dụng Thực Tế cho Kiểu TIMESTAMP
- 6 6. Lưu Ý Quan Trọng Khi Sử Dụng Kiểu TIMESTAMP
- 7 7. Tóm tắt và Khuyến nghị
- 8 8. Câu hỏi thường gặp (FAQ)
- 8.1 Làm thế nào để chọn giữa TIMESTAMP và DATETIME?
- 8.2 Có đúng là TIMESTAMP không thể sử dụng sau năm 2038 không?
- 8.3 Làm thế nào để cho phép giá trị NULL trong cột TIMESTAMP?
- 8.4 Nếu tôi thay đổi cài đặt múi giờ, nó có ảnh hưởng đến dữ liệu TIMESTAMP hiện có không?
- 8.5 Nếu tôi sử dụng CURRENT_TIMESTAMP, tôi vẫn có thể chèn một ngày‑giờ cụ thể không?
1. MySQL TIMESTAMP là gì?
The TIMESTAMP data type in MySQL is designed to store a specific point in time in UTC (Coordinated Universal Time) and automatically handle time zone conversion when saving and retrieving data. This data type can handle dates and times in the range from January 1, 1970 to January 19, 2038. When saving data to the database, TIMESTAMP uses the current time zone, and when retrieving data, it is automatically converted based on the system time zone.
Kiểu dữ liệu TIMESTAMP trong MySQL được thiết kế để lưu trữ một thời điểm cụ thể theo UTC (Coordinated Universal Time) và tự động xử lý việc chuyển đổi múi giờ khi lưu và truy xuất dữ liệu. Kiểu dữ liệu này có thể xử lý ngày và giờ trong khoảng từ 1 tháng 1 năm 1970 đến 19 tháng 1 năm 2038. Khi lưu dữ liệu vào cơ sở dữ liệu, TIMESTAMP sử dụng múi giờ hiện tại, và khi truy xuất dữ liệu, nó sẽ tự động được chuyển đổi dựa trên múi giờ hệ thống.
Sự khác biệt giữa TIMESTAMP và DATETIME
The DATETIME data type is often compared with TIMESTAMP. DATETIME stores date and time values “as‑is,” so the stored data is not affected by time zones. In contrast, TIMESTAMP is converted to UTC when stored and converted back to the system time zone when retrieved, which helps prevent time offsets across environments.
Kiểu dữ liệu DATETIME thường được so sánh với TIMESTAMP. DATETIME lưu trữ giá trị ngày và giờ “nguyên gốc”, vì vậy dữ liệu được lưu không bị ảnh hưởng bởi múi giờ. Ngược lại, TIMESTAMP được chuyển sang UTC khi lưu và được chuyển lại sang múi giờ hệ thống khi truy xuất, giúp ngăn ngừa sự lệch thời gian giữa các môi trường.
For example, TIMESTAMP is especially useful during system migrations or when working with databases across multiple time zones. DATETIME supports a wider range—from year 1000 to 9999—so it is often used to avoid the Year 2038 problem.
Ví dụ, TIMESTAMP đặc biệt hữu ích trong quá trình di chuyển hệ thống hoặc khi làm việc với các cơ sở dữ liệu trên nhiều múi giờ. DATETIME hỗ trợ phạm vi rộng hơn — từ năm 1000 đến 9999 — vì vậy nó thường được dùng để tránh vấn đề Năm 2038.
Ví dụ sử dụng TIMESTAMP
You can create a table using TIMESTAMP as follows.
Bạn có thể tạo một bảng sử dụng TIMESTAMP như sau.
CREATE TABLE events (
id INT AUTO_INCREMENT PRIMARY KEY,
event_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
In this example, the event_time column automatically stores the current time when a record is inserted, and overwrites that value each time the record is updated.
Trong ví dụ này, cột event_time tự động lưu thời gian hiện tại khi một bản ghi được chèn, và ghi đè giá trị đó mỗi khi bản ghi được cập nhật.
2. Cách sử dụng cơ bản của TIMESTAMP
When using TIMESTAMP in MySQL, it is important to understand the basic ways to insert and retrieve values. Below are several common approaches to working with TIMESTAMP data.
Khi sử dụng TIMESTAMP trong MySQL, việc hiểu các cách cơ bản để chèn và truy xuất giá trị là rất quan trọng. Dưới đây là một số phương pháp phổ biến để làm việc với dữ liệu TIMESTAMP.
Chèn ngày và giờ
When inserting data into a TIMESTAMP column, you typically specify the date and time in a string format. The date is represented as “YYYY‑MM‑DD” and the time as “hh:mm:ss”.
Khi chèn dữ liệu vào cột TIMESTAMP, bạn thường chỉ định ngày và giờ dưới dạng chuỗi. Ngày được biểu diễn dưới dạng “YYYY‑MM‑DD” và giờ dưới dạng “hh:mm:ss”.
INSERT INTO events (event_time) VALUES ('2023-10-01 12:30:00');
This SQL statement inserts 12:30:00 on October 1, 2023 into the event_time column.
Câu lệnh SQL này chèn thời gian 12:30:00 ngày 1 tháng 10 năm 2023 vào cột event_time.
Chèn thời gian hiện tại
Using MySQL’s NOW() function, you can easily get the current date and time. This function returns the current date and time based on the system time zone, and you can insert it directly into a TIMESTAMP column.
Sử dụng hàm NOW() của MySQL, bạn có thể dễ dàng lấy ngày và giờ hiện tại. Hàm này trả về ngày và giờ hiện tại dựa trên múi giờ hệ thống, và bạn có thể chèn trực tiếp vào cột TIMESTAMP.
INSERT INTO events (event_time) VALUES (NOW());
In this example, the current time at the moment the SQL is executed is inserted automatically.
Trong ví dụ này, thời gian hiện tại tại thời điểm câu lệnh SQL được thực thi sẽ được chèn tự động.
Sử dụng tính năng tự cập nhật
If you specify ON UPDATE CURRENT_TIMESTAMP for a TIMESTAMP column, the update time is automatically recorded every time the record is updated.
Nếu bạn chỉ định ON UPDATE CURRENT_TIMESTAMP cho một cột TIMESTAMP, thời gian cập nhật sẽ được ghi lại tự động mỗi khi bản ghi được cập nhật.
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
In this table, order_time is set to the current time when the record is created, and it is updated every time the record is updated.
Trong bảng này, order_time được đặt là thời gian hiện tại khi bản ghi được tạo, và nó sẽ được cập nhật mỗi khi bản ghi được sửa đổi.

3. Làm việc với TIMESTAMP và múi giờ
One of the biggest features of TIMESTAMP is time zone handling. Stored data is always converted to UTC, and when you retrieve it from the database, it is converted again to match the system time zone.
Một trong những tính năng quan trọng nhất của TIMESTAMP là xử lý múi giờ. Dữ liệu được lưu luôn được chuyển sang UTC, và khi bạn truy xuất từ cơ sở dữ liệu, nó lại được chuyển lại để phù hợp với múi giờ hệ thống.
Cách kiểm tra cài đặt múi giờ
In MySQL, you can set the time zone per server or per session. You can check the time zone setting using the SHOW VARIABLES command.
Trong MySQL, bạn có thể đặt múi giờ cho toàn bộ máy chủ hoặc cho từng phiên. Bạn có thể kiểm tra cài đặt múi giờ bằng lệnh SHOW VARIABLES.
SHOW VARIABLES LIKE 'time_zone';
This command returns the time zone currently configured for the database. To change the time zone, use the following statement.
Lệnh này trả về múi giờ hiện đang được cấu hình cho cơ sở dữ liệu. Để thay đổi múi giờ, sử dụng câu lệnh sau.
SET time_zone = '+09:00';
Sự khác biệt múi giờ giữa TIMESTAMP và DATETIME
The DATETIME type stores date and time without considering time zones, while the TIMESTAMP type is converted to UTC when saved. Therefore, in environments where multiple time zones coexist, TIMESTAMP is often the better choice.
Kiểu DATETIME lưu trữ ngày và giờ mà không xét đến múi giờ, trong khi kiểu TIMESTAMP được chuyển sang UTC khi lưu. Do đó, trong các môi trường có nhiều múi giờ đồng thời, TIMESTAMP thường là lựa chọn tốt hơn.
4. Vấn đề Năm 2038 và tác động của nó
The Year 2038 problem is caused by the limitation of the TIMESTAMP type on 32-bit systems. MySQL’s TIMESTAMP type is based on the number of seconds since 00:00:00 UTC on January 1, 1970. When it exceeds 03:14:07 UTC on January 19, 2038, this value overflows.
Cách Tránh Vấn Đề Năm 2038
Để tránh vấn đề này, nên sử dụng hệ thống 64-bit hoặc kiểu DATETIME có phạm vi rộng hơn. DATETIME có thể xử lý ngày và giờ từ năm 1000 đến 9999, vì vậy có thể được sử dụng an toàn sau năm 2038.
Bạn cũng có thể tránh vấn đề này bằng cách nâng cấp hệ thống của mình. Vì các hệ thống 64-bit không có giới hạn Năm 2038, nên việc nâng cấp cơ sở dữ liệu và các ứng dụng là điều quan trọng.
5. Các Trường Hợp Sử Dụng Thực Tế cho Kiểu TIMESTAMP
Kiểu TIMESTAMP của MySQL không chỉ dùng để lưu trữ các giá trị ngày và giờ cơ bản, mà còn hỗ trợ nhiều mẫu thực tế như tự động chèn hoặc cập nhật thời gian hiện tại. Dưới đây là một số trường hợp sử dụng nâng cao phổ biến.
Tự Động Chèn Thời Gian Hiện Tại
Khi định nghĩa một cột TIMESTAMP, bạn có thể đặt CURRENT_TIMESTAMP làm giá trị mặc định để ngày và giờ hiện tại được tự động chèn mỗi khi tạo một bản ghi mới. Ví dụ, để tạo một bảng tự động ghi lại thời điểm một đơn hàng xảy ra, bạn có thể thực hiện như sau.
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Tự Động Ghi Lại Thời Gian Cập Nhật
Bằng cách chỉ định ON UPDATE CURRENT_TIMESTAMP, thời gian cập nhật sẽ được tự động ghi lại mỗi khi một bản ghi được cập nhật. Điều này giúp quản lý lịch sử cập nhật một cách tự động và dễ dàng.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Sử Dụng Nhiều Cột TIMESTAMP
Trong MySQL, bạn có thể bao gồm nhiều cột TIMESTAMP trong một bảng, nhưng mặc định chỉ một cột có thể có CURRENT_TIMESTAMP làm giá trị mặc định. Nếu muốn quản lý nhiều timestamp một cách tự động, bạn cần đặt giá trị rõ ràng cho các cột còn lại hoặc sử dụng kiểu DATETIME.
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
6. Lưu Ý Quan Trọng Khi Sử Dụng Kiểu TIMESTAMP
Khi sử dụng kiểu TIMESTAMP, có một số lưu ý quan trọng cần hiểu. Nắm rõ chúng giúp ngăn ngừa các bất nhất và lỗi không mong muốn.
Ràng Buộc NULL và Giá Trị Mặc Định
Mặc định, một ràng buộc NOT NULL được áp dụng cho các cột TIMESTAMP. Nói cách khác, nếu bạn muốn cho phép giá trị NULL, bạn phải chỉ định rõ ràng DEFAULT NULL.
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
log_time TIMESTAMP DEFAULT NULL
);
Bạn cũng có thể chỉ định DEFAULT 0 để đặt giá trị datetime không hợp lệ 0000-00-00 00:00:00 làm mặc định. Tuy nhiên, điều này không được khuyến nghị. Trong chế độ SQL nghiêm ngặt của MySQL, datetime không hợp lệ này có thể gây lỗi.
Vấn Đề với 0000-00-00 00:00:00
Một số phiên bản MySQL hỗ trợ 0000-00-00 00:00:00 như một giá trị datetime không hợp lệ, nhưng nó có thể gây ra các vấn đề vận hành trong các hệ thống thực tế. Đặc biệt, các hệ thống ưu tiên tính toàn vẹn dữ nên tránh các giá trị không hợp lệ này. Thay vào đó, nên sử dụng NULL hoặc một giá trị mặc định phù hợp.
CREATE TABLE sessions (
id INT AUTO_INCREMENT PRIMARY KEY,
start_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
end_time TIMESTAMP NULL
);
Ảnh Hưởng của Múi Giờ Hệ Thống
Vì kiểu TIMESTAMP được lưu sau khi chuyển đổi sang UTC, bạn cần cẩn thận khi di chuyển cơ sở dữ liệu qua các múi giờ khác nhau. Nếu cài đặt múi giờ của máy chủ thay đổi, thời gian truy xuất có thể trở thành các giá trị không mong muốn. Vì vậy, việc quản lý múi giờ một cách chính xác là rất quan trọng.
SET time_zone = 'Asia/Tokyo';
Lệnh này đặt múi giờ của cơ sở dữ liệu thành Tokyo và đảm bảo việc quản lý chuyển đổi từ UTC một cách chính xác.

7. Tóm tắt và Khuyến nghị
Kiểu TIMESTAMP là một công cụ mạnh mẽ để quản lý ngày và giờ một cách hiệu quả trong MySQL. Đặc biệt, việc tự động chuyển đổi theo múi giờ và tự động ghi lại thời gian khi tạo/cập nhật rất tiện lợi. Tuy nhiên, cần hiểu các hạn chế và lưu ý như vấn đề Năm 2038 và cách xử lý giá trị NULL.
Khi nào nên sử dụng TIMESTAMP
- Khi bạn cần hành vi tự động cập nhật,
TIMESTAMPlà lựa chọn lý tưởng—đặc biệt nếu bạn muốn ghi lại dấu thời gian một cách tự động mỗi khi một bản ghi được cập nhật. - Trong các hệ thống cần xem xét múi giờ, hành vi chuyển đổi dựa trên UTC của
TIMESTAMPrất hữu ích. - Ngược lại, nếu bạn cần phạm vi tương lai hoặc phải xử lý các ngày nằm ngoài phạm vi hỗ trợ (sau năm 2038), hãy cân nhắc sử dụng
DATETIME.
Cuối cùng, hãy chọn giữa TIMESTAMP và DATETIME dựa trên yêu cầu của hệ thống để đảm bảo tính toàn vẹn và khả năng bảo trì dữ liệu.
8. Câu hỏi thường gặp (FAQ)
Các câu hỏi và vấn đề liên quan đến MySQL TIMESTAMP thường gặp ở các nhà phát triển, vì vậy phần này tóm tắt các câu hỏi thường gặp. Những FAQ này cung cấp các mẹo hữu ích và giải pháp để xử lý TIMESTAMP một cách chính xác.
Làm thế nào để chọn giữa TIMESTAMP và DATETIME?
TIMESTAMP tự động chuyển đổi giá trị dựa trên múi giờ sử dụng UTC, do đó phù hợp cho các ứng dụng và hệ thống phải tính đến nhiều múi giờ. Nó cũng hỗ trợ tự động lưu giá trị ngày/giờ khi bản ghi được tạo hoặc cập nhật. Ngược lại, DATETIME lưu giá trị “nguyên trạng”, vì vậy nó tốt hơn khi bạn cần quản lý ngày‑giờ nhất quán mà không có chuyển đổi múi giờ.
Có đúng là TIMESTAMP không thể sử dụng sau năm 2038 không?
Đúng. Vấn đề Năm 2038 áp dụng cho kiểu TIMESTAMP 32‑bit. Vì nó dựa trên số giây kể từ ngày 1 tháng 1 năm 1970, nên không thể biểu diễn ngày‑giờ sau ngày 19 tháng 1 năm 2038. Để tránh điều này, nên di chuyển sang hệ thống 64‑bit hoặc sử dụng kiểu DATETIME.
Làm thế nào để cho phép giá trị NULL trong cột TIMESTAMP?
Để cho phép giá trị NULL trong cột TIMESTAMP, bạn phải chỉ định rõ DEFAULT NULL như dưới đây.
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
log_time TIMESTAMP DEFAULT NULL
);
Với cài đặt này, nếu bạn chèn một bản ghi mà không chỉ định ngày‑giờ, một giá trị NULL sẽ được lưu.
Nếu tôi thay đổi cài đặt múi giờ, nó có ảnh hưởng đến dữ liệu TIMESTAMP hiện có không?
Vì các giá trị TIMESTAMP được chuyển sang UTC khi lưu, việc thay đổi cài đặt múi giờ sẽ ảnh hưởng đến cách dữ liệu được hiển thị khi truy xuất. Dữ liệu gốc vẫn được lưu ở UTC, nhưng sẽ được chuyển đổi dựa trên múi giờ mới, dẫn đến các giá trị thời gian được truy xuất thay đổi. Để duy trì tính nhất quán của dữ liệu, việc chuẩn hoá cài đặt múi giờ trên toàn hệ thống là rất quan trọng.
Nếu tôi sử dụng CURRENT_TIMESTAMP, tôi vẫn có thể chèn một ngày‑giờ cụ thể không?
CURRENT_TIMESTAMP tự động chèn thời gian hiện tại khi bản ghi được chèn, nhưng bạn vẫn có thể chèn một ngày‑giờ cụ thể một cách rõ ràng bằng cách sử dụng NOW() hoặc một chuỗi ký tự.
INSERT INTO events (event_time) VALUES ('2023-10-01 12:30:00');
Bằng cách này, bạn có thể chèn ngày‑giờ một cách thủ công ngay cả khi sử dụng CURRENT_TIMESTAMP.


