Sự khác biệt giữa TIMESTAMP và DATETIME trong MySQL


Phần mở đầu
Bạn mới học MySQL và nghe nhắc đến hai kiểu dữ liệu: TIMESTAMP và DATETIME. Trước mắt, chúng đều lưu được “ngày giờ”, vậy… khác nhau chỗ nào? Quan trọng để làm gì? Chuyện này tưởng nhỏ mà lắm lúc gây “đau đầu” vì… lệch múi giờ, giới hạn năm tháng, cho đến chuyện lưu trữ sao cho tiết kiệm. Mình gọi đây là “cuộc chiến” giữa TIMESTAMP và DATETIME. Bài này sẽ giúp bạn hiểu rõ từng loại, cách dùng phù hợp, và vừa dễ học vừa dễ nhớ.
Nội dung chính
1. Cơ bản nhất – Lưu giống, khác chỗ nào?
- Cả TIMESTAMP và DATETIME đều chứa đủ ngày và giờ (YYYY-MM-DD hh\:mm\:ss) (MySQL, DEV Community).
Điểm khác:
- TIMESTAMP: dùng 4 bytes, lưu được từ 1970-01-01 00:00:01 đến 2038-01-19 03:14:07 (còn gọi là vấn đề Year-2038) (PlanetScale, MySQL).
- DATETIME: dùng 8 bytes, lưu được từ 1000-01-01 00:00:00 đến 9999-12-31 23:59:59 – rất rộng và “thoải mái” hơn (PlanetScale, MySQL).
Ví dụ thực tế:
- Lưu sinh nhật người dùng: nên dùng DATETIME — vì có thể sinh viên tuổi nào, năm nào đều lưu được.
- Lưu thời gian các bản ghi “created_at”, “updated_at”: TIMESTAMP là lựa chọn hợp lý — nhanh, tiết kiệm và đủ dùng trong khoảng từ 1970 đến năm 2038.
2. Múi giờ – Ai phải lo, ai an toàn?
- TIMESTAMP có “giúp bạn” về múi giờ: nó luôn lưu theo UTC, khi lưu thì MySQL chuyển từ thời gian local sang UTC, khi lấy lại thì chuyển từ UTC về local của session (PlanetScale, Oliver Lundquist).
- DATETIME thì… đơn giản thôi, mình ghi bao nhiêu thì lấy ra y như thế — không đổi (PlanetScale, DEV Community).
Ví dụ:
-- Giả sử server UTC, bạn ghi '2029-02-14 08:47'
INSERT INTO tz_test VALUES ('2029-02-14 08:47', '2029-02-14 08:47');
-- = TIMESTAMP, DATETIME cùng giữ '2029-02-14 08:47'
-- Nếu chuyển session sang time_zone = '-05:00'
SELECT * FROM tz_test;
-- TIMESTAMP → 2029-02-14 03:47
-- DATETIME → giữ nguyên 2029-02-14 08:47
Bạn thấy đấy, TIMESTAMP tự dịch, DATETIME thì… rất “trơn tru” (Oliver Lundquist).
3. Tóm tắt so sánh
Tiêu chí | TIMESTAMP | DATETIME |
Dung lượng | 4 bytes | 8 bytes |
Khoảng thời gian | 1970 → 2038 | 1000 → 9999 |
Múi giờ | Có xử lý tự động (UTC ↔ session) | Không thay đổi dù session như thế nào |
Khi dùng hợp lý | “created_at” kiểu data cài đặt tự động… | Các sự kiện tương lai, lịch sử lâu dài… |
4. Code ví dụ minh họa
Bạn tạo bảng lưu thời gian nhập môn danh cho sinh viên:
CREATE TABLE study_sessions (
student_id INT,
started_at DATETIME, -- thời gian bắt đầu (người nhập vào nào nhập mấy giờ thì lưu vậy)
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
started_at
: bạn nhập từ form đăng ký, để giữ nguyên, dùng DATETIME.updated_at
: tự động, ai cập nhật lần cuối, chạy nhanh, dùng TIMESTAMP.
5. Ẩn dụ sống động
- DATETIME như cuốn nhật kí được bạn viết tay, lưu lại đúng từng chữ, không đổi — dù hôm sau bạn ở Mỹ hay Việt, vẫn vậy.
- TIMESTAMP như chiếc đồng hồ thông minh, tự đổi múi giờ, bạn du lịch từ Việt sang phố New York, nó cũng sẽ tự điều chỉnh đúng giờ địa phương.
6. Một số cảnh báo nhỏ
- Với TIMESTAMP, hãy để session timezone là UTC để tránh vài giờ lệch ngớ ngẩn.
- DATETIME thì rất rõ ràng, nhưng nếu bạn cần “xử lý tự động” theo múi giờ, thì… phải tự làm thủ công.
- Khi hệ thống bước vào năm 2040, nếu dùng TIMESTAMP gần giới hạn, hãy đổi sang DATETIME hoặc types mới hơn.
Phần tương tác nhẹ
Bạn thử nghĩ:
- Nếu làm app nhắc sinh nhật bạn bè từ năm 1200 (hư cấu nha), dùng kiểu nào hợp lý?
- Nếu làm ứng dụng chat toàn cầu, vừa cần ghi lại thời điểm tin nhắn gửi đi theo user, vừa theo UTC… bạn sẽ chọn kiểu gì?
Phần kết
- TIMESTAMP: gọn nhẹ, tự xử lý múi giờ, giới hạn đến năm 2038 → hợp để lưu thời gian hệ thống, các trạng thái như
created_at
,updated_at
. - DATETIME: rộng rãi, ổn định, không liên quan đến múi giờ → hợp để ghi dữ liệu người nhập, lịch sử tương lai hoặc quá khứ xa.
- Nhớ rằng: lựa chọn kiểu dữ liệu phù hợp là bước đầu để ứng dụng “vững” về sau.
Lời khuyên nhỏ: luôn để mindset là “chọn đúng công cụ, hiểu đúng nơi dùng”. Khi nắm rõ ưu — khuyết của mỗi kiểu, bạn sẽ tránh được nhiều bug liên quan thời gian phức tạp sau này.
Tài liệu tham khảo
- MySQL Reference Manual – DATE, DATETIME, TIMESTAMP types (MySQL)
- So sánh chi tiết (blog PlanetScale) (PlanetScale)
- Ví dụ từ StackOverflow: nên dùng TIMESTAMP hay DATETIME? (Stack Overflow)
Hi vọng bài viết giúp bạn có cái nhìn rõ ràng, gần gũi hơn về TIMESTAMP và DATETIME. Nếu bạn muốn tiếp tục đi sâu vào cách xử lý timezone trong ứng dụng thực tế, mình rất vui hỗ trợ nhé!
Subscribe to my newsletter
Read articles from Binlerdev directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
