1. MySQL DATETIME là gì?
MySQL DATETIME là một kiểu dữ liệu dùng để lưu trữ cả ngày và giờ trong một trường duy nhất. Việc quản lý các giá trị ngày và giờ trong cơ sở dữ liệu là rất quan trọng đối với nhiều ứng dụng, chẳng hạn như hệ thống ghi log và hệ thống đặt chỗ. Kiểu DATETIME lưu trữ ngày và giờ cùng nhau và hỗ trợ một loạt giá trị rộng. Phạm vi của nó là từ '1000-01-01 00:00:00' đến '9999-12-31 23:59:59', và nó cũng hỗ trợ giây thập phân.
2. Tổng quan về các kiểu dữ liệu ngày và giờ trong MySQL
2.1 Các kiểu dữ liệu để xử lý ngày và giờ
MySQL cung cấp các kiểu dữ liệu sau để làm việc với ngày và giờ:
DATE: Lưu trữ ngày (năm, tháng, ngày). Phạm vi là'1000-01-01'đến'9999-12-31'.TIME: Lưu trữ chỉ giờ. Phạm vi là'-838:59:59'đến'838:59:59'.DATETIME: Lưu trữ cả ngày và giờ. Phạm vi là'1000-01-01 00:00:00'đến'9999-12-31 23:59:59'.TIMESTAMP: Lưu trữ dấu thời gian UNIX. Phạm vi là'1970-01-01 00:00:01'đến'2038-01-19 03:14:07'.
2.2 Sự khác biệt giữa DATETIME và TIMESTAMP
DATETIME và TIMESTAMP tương tự nhau, nhưng chúng có những khác biệt sau:
- Múi giờ :
DATETIMElưu trữ một giá trị cố định không phụ thuộc vào múi giờ. Ngược lại,TIMESTAMPđược chuyển đổi sang UTC khi lưu trữ và được chuyển đổi sang múi giờ hiện tại của máy chủ khi truy xuất. Vì lý do này,DATETIMEphù hợp cho các giá trị ngày/giờ không phụ thuộc vào múi giờ (ví dụ: thời gian sự kiện), trong khiTIMESTAMPphù hợp cho dữ liệu liên kết với múi giờ của máy chủ, chẳng hạn như log. - Định dạng lưu trữ :
DATETIMEđược lưu trữ nguyên bản, trong khiTIMESTAMPđược lưu trữ dưới dạng dấu thời gian UNIX. Kết quả là, các giá trịTIMESTAMPbị ảnh hưởng bởi cài đặt múi giờ của máy chủ khi biểu diễn thời gian.
3. Cách sử dụng DATETIME trong MySQL
3.1 Tạo cột DATETIME
Để tạo một cột với kiểu DATETIME, sử dụng cú pháp SQL sau:
CREATE TABLE sample_table (
event_time DATETIME
);
Trong ví dụ này, một cột DATETIME có tên event_time được tạo trong bảng có tên sample_table.
3.2 Chèn giá trị DATETIME
Các giá trị MySQL DATETIME có thể được chèn dưới nhiều định dạng khác nhau. Định dạng cơ bản là 'YYYY-MM-DD HH:MM:SS'. Ví dụ:
INSERT INTO sample_table (event_time) VALUES ('2024-09-16 14:30:00');
Các định dạng sau cũng được phép:
'YY-MM-DD HH:MM:SS': Định dạng sử dụng năm 2 chữ số.'YYYYMMDDHHMMSS': Định dạng không có dấu phân cách.
Ví dụ:
INSERT INTO sample_table (event_time) VALUES ('24-09-16 14:30:00');
INSERT INTO sample_table (event_time) VALUES (20240916143000);
Dữ liệu được chèn dưới các định dạng này sẽ được lưu trữ chính xác. Nếu năm được chỉ định bằng hai chữ số, '70-99' sẽ được chuyển đổi thành 1970-1999, và '00-69' sẽ được chuyển đổi thành 2000-2069.
3.3 Truy xuất giá trị DATETIME
Khi truy xuất các giá trị DATETIME, MySQL hiển thị chúng dưới định dạng mặc định 'YYYY-MM-DD HH:MM:SS'. Ví dụ:
SELECT event_time FROM sample_table;
Truy vấn này hiển thị các giá trị trong cột DATETIME bằng định dạng chuẩn.
4. Làm việc với giây thập phân
4.1 Độ chính xác của DATETIME
Trong MySQL, các giá trị DATETIME có thể bao gồm giây thập phân. Bạn có thể chỉ định độ chính xác bằng tùy chọn fsp, cho phép lưu trữ giây thập phân từ 0 đến 6 chữ số. Ví dụ, để tạo một cột với 3 chữ số giây thập phân:
CREATE TABLE precise_times (
event_time DATETIME(3)
);
Trong ví dụ này, cột event_time có thể lưu trữ giây thập phân lên đến 3 chữ số.
4.2 Chèn giá trị với giây thập phân
Để chèn một giá trị DATETIME bao gồm giây thập phân, sử dụng như sau:
INSERT INTO precise_times (event_time) VALUES ('2024-09-16 14:30:00.123');
.Câu truy vấn này lưu giá trị bao gồm phần giây thập phân một cách chính xác. Phần thập phân được lưu mà không bị cắt ngắn, và độ chính xác được bảo toàn khi truy xuất giá trị.

5. Các Thực Hành Tốt Nhất cho DATETIME
5.1 Lựa Chọn Giữa DATETIME và TIMESTAMP
- Khi nào nên dùng
DATETIME: Đối với các giá trị ngày/giờ cố định không phụ thuộc vào múi giờ (ví dụ: thời gian bắt đầu sự kiện hoặc ngày đặt chỗ). - Khi nào nên dùng
TIMESTAMP: Đối với dữ liệu ngày/giờ liên quan đến múi giờ của máy chủ (ví dụ: thời gian tạo hoặc cập nhật bản ghi).
5.2 Quản Lý Múi Giờ
Vì DATETIME không lưu thông tin múi giờ, ứng dụng của bạn phải tự quản lý múi giờ riêng. Ngược lại, TIMESTAMP tự động tính đến múi giờ của máy chủ khi lưu và truy xuất giá trị, nên phù hợp cho các hệ thống hoạt động trên nhiều múi giờ khác nhau trên toàn thế giới.
6. Những Sai Lầm Thường Gặp và Cách Tránh
6.1 Ngày Zero và Giá Trị Không Hợp Lệ
Trong MySQL, nếu bạn cố gắng chèn một giá trị DATETIME không hợp lệ, một ngày zero như '0000-00-00 00:00:00' có thể được lưu. Vì đây thường không phải là một ngày hợp lệ, bạn nên kiểm tra dữ liệu đầu vào để ngăn chặn việc lưu các giá trị không hợp lệ. Việc thực hiện xác thực đảm bảo đầu vào tuân theo phạm vi và định dạng đúng sẽ giúp tránh việc lưu các ngày zero.
6.2 Sử Dụng Sai Độ Chính Xác
Khi chỉ định độ chính xác giây thập phân, việc dùng độ chính xác không đúng có thể tạo ra kết quả bất ngờ. Chỉ đặt độ chính xác giây thập phân khi thực sự cần thiết và chọn giá trị fsp một cách cẩn thận. Ví dụ, nếu ứng dụng của bạn không yêu cầu độ chính xác dưới giây, bạn không cần thêm phần giây thập phân vào cột DATETIME.
7. Tóm Tắt
Trong bài viết này, chúng tôi đã giải thích chi tiết về kiểu dữ liệu DATETIME của MySQL. DATETIME là một kiểu dữ liệu rất hữu ích để lưu cả ngày và giờ, và phù hợp khi bạn cần lưu các giá trị không bị ảnh hưởng bởi múi giờ. Bằng cách hiểu sự khác nhau giữa DATETIME và TIMESTAMP, cách múi giờ hoạt động và cách sử dụng giây thập phân, bạn có thể quản lý dữ liệu ngày/giờ hiệu quả hơn trong cơ sở dữ liệu. Ngoài ra, việc nắm rõ các sai lầm thường gặp và cách tránh chúng sẽ giúp duy trì tính nhất quán và độ tin cậy của dữ liệu.
8. Câu Hỏi Thường Gặp (FAQ)
Q1: Sự khác biệt chính giữa DATETIME và TIMESTAMP là gì?
DATETIME lưu một ngày và giờ cố định không phụ thuộc vào múi giờ. Ví dụ, nó phù hợp để lưu ngày đặt chỗ hoặc thời gian sự kiện mà phải giữ nguyên ở mọi múi giờ. Ngược lại, TIMESTAMP được lưu dưới dạng UTC và được chuyển đổi sang múi giờ của máy chủ khi truy xuất. Nó phù hợp cho dữ liệu ngày/giờ phụ thuộc vào múi giờ của máy chủ, chẳng hạn như các bản ghi log.
Q2: Làm sao tôi có thể lưu giây thập phân với DATETIME?
Bạn có thể đặt độ chính xác giây thập phân bằng cách chỉ định giá trị fsp khi tạo cột DATETIME. Ví dụ, DATETIME(3) lưu giây thập phân lên tới 3 chữ số. Khi chèn, hãy sử dụng giá trị được định dạng đúng bao gồm phần giây thập phân và nó sẽ được lưu chính xác.
Q3: Tôi nên dùng DATETIME hay TIMESTAMP?
Điều này phụ thuộc vào trường hợp sử dụng của bạn. Dùng DATETIME khi bạn muốn lưu một ngày và giờ cố định. Dùng TIMESTAMP cho dữ liệu ngày/giờ bị ảnh hưởng bởi múi giờ của máy chủ, chẳng hạn như thời gian tạo hoặc cập nhật bản ghi. Vì TIMESTAMP thực hiện tự động chuyển đổi múi giờ, nó phù hợp khi hệ thống của bạn phải hoạt động trên nhiều múi giờ khác nhau.


