1. DATETIME
của MySQL là gì?
DATETIME
của MySQL là một kiểu dữ liệu dùng để xử lý đồng thời cả ngày và giờ. Việc quản lý ngày giờ trong cơ sở dữ liệu là rất cần thiết cho nhiều ứng dụng khác nhau, chẳng hạn như ghi nhật ký hoặc hệ thống đặt chỗ. Kiểu DATETIME
lưu trữ ngày và giờ trong một trường duy nhất và có thể chứa một phạm vi giá trị rộng, từ '1000-01-01 00:00:00'
đến '9999-12-31 23:59:59'
, đồng thời hỗ trợ cả giây thập phân.
2. Tổng quan về các kiểu dữ liệu ngày giờ trong MySQL
2.1 Các kiểu dữ liệu xử lý ngày và giờ
MySQL có các kiểu dữ liệu sau để xử lý ngày và giờ:
DATE
: Kiểu dữ liệu xử lý ngày, tháng, năm. Phạm vi từ'1000-01-01'
đến'9999-12-31'
.TIME
: Kiểu dữ liệu chỉ xử lý thời gian. Phạm vi từ'-838:59:59'
đến'838:59:59'
.DATETIME
: Kiểu dữ liệu kết hợp xử lý cả ngày và giờ. Phạm vi từ'1000-01-01 00:00:00'
đến'9999-12-31 23:59:59'
.TIMESTAMP
: Kiểu dữ liệu lưu trữ dấu thời gian UNIX. Phạm vi từ'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 có những khác biệt sau:
- Múi giờ:
DATETIME
lư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 và được chuyển đổi trở lại múi giờ hiện tại của máy chủ khi truy xuất. Do đó,DATETIME
phù hợp cho các ngày giờ không bị ảnh hưởng bởi múi giờ (ví dụ: thời gian sự kiện), trong khiTIMESTAMP
phù hợp cho dữ liệu liên quan đến múi giờ của máy chủ, chẳng hạn như ghi nhật ký. - Định dạng lưu trữ:
DATETIME
được lưu trữ ở định dạng nguyên bản, trong khiTIMESTAMP
được lưu trữ dưới dạng dấu thời gian UNIX. Do đó,TIMESTAMP
bị ảnh hưởng bởi cài đặt múi giờ của máy chủ đối với biểu diễn thời gian của dữ liệu.
3. Cách sử dụng DATETIME
trong MySQL
3.1 Tạo cột DATETIME
Để tạo một cột kiểu DATETIME
, bạn 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 sample_table
.
3.2 Chèn giá trị DATETIME
Giá trị DATETIME
của MySQL có thể được chèn ở 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 chỉ định năm bằng 2 chữ số.'YYYYMMDDHHMMSS'
: Định dạng không có ký tự 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 bằng các định dạng này sẽ được lưu trữ đúng cách. Khi năm được chỉ định bằng 2 chữ số, '70-99'
được chuyển đổi thành 1970-1999
, và '00-69'
được chuyển đổi thành 2000-2069
.
3.3 Truy xuất giá trị DATETIME
Khi truy xuất giá trị DATETIME
, MySQL sẽ hiển thị theo định dạng 'YYYY-MM-DD HH:MM:SS'
theo mặc định. Ví dụ:
SELECT event_time FROM sample_table;
Truy vấn này sẽ hiển thị các giá trị của cột DATETIME
trong bảng theo định dạng chuẩn.
4. Xử lý giây thập phân
4.1 Độ chính xác của DATETIME
Trong MySQL, giá trị DATETIME
có thể chứa giây thập phân. Độ chính xác có thể được chỉ định bằng tùy chọn fsp
, với giá trị từ 0 đến 6 để lưu trữ giây thập phân. Ví dụ, để tạo một cột có 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ữ đến 3 chữ số giây thập phân.
4.2 Chèn giá trị có giây thập phân
Để chèn giá trị DATETIME
có chứa giây thập phân, bạn làm như sau:
INSERT INTO precise_times (event_time) VALUES ('2024-09-16 14:30:00.123');
Truy vấn này sẽ lưu trữ chính xác các giá trị có giây thập phân. Các giá trị phần thập phân được chèn sẽ được lưu trữ mà không bị cắt bớt và độ chính xác được giữ nguyên khi truy xuất.
5. Các thực hành tốt nhất cho DATETIME
5.1 Khi nào sử dụng DATETIME
và TIMESTAMP
- Khi sử dụng
DATETIME
: Đối với 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, ngày đặt chỗ). - Khi sử 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ụ: ngày tạo hoặc ngày cập nhật dữ liệu).
5.2 Quản lý múi giờ
Vì DATETIME
không có khái niệm múi giờ, việc quản lý múi giờ là cần thiết ở phía ứng dụ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 hoạt động trên khắp các múi giờ khác nhau trên thế giới.
6. Các lỗi thường gặp và cách khắc phục
6.1 Ngày giờ “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” là '0000-00-00 00:00:00'
sẽ được lưu trữ. Vì đây thường không phải là một ngày hợp lệ, bạn cần xác thực dữ liệu đầu vào và ngăn chặn việc chèn các giá trị không hợp lệ. Bằng cách triển khai xác thực để đảm bảo dữ liệu đầu vào tuân thủ phạm vi và định dạng thích hợp, bạn có thể ngăn chặn việc lưu trữ ngày “zero”.
6.2 Sử dụng sai độ chính xác
Khi chỉ định độ chính xác của giây thập phân, việc sử dụng sai độ chính xác có thể dẫn đến kết quả không mong muốn. Chỉ chỉ định độ chính xác của giây thập phân khi cần thiết và cẩn thận đặt giá trị fsp
. 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 phải đặt giây thập phân cho cột DATETIME
.
7. Tóm tắt
Bài viết này đã giải thích chi tiết về kiểu dữ liệu DATETIME
trong MySQL. DATETIME
là một kiểu dữ liệu rất hữu ích để xử lý đồng thời cả ngày và giờ, phù hợp để lưu trữ các giá trị không bị ảnh hưởng bởi múi giờ. Bằng cách hiểu sự khác biệt giữa DATETIME
và TIMESTAMP
, cách xử lý múi giờ 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ờ trong cơ sở dữ liệu một cách hiệu quả. Ngoài ra, việc nắm vững các lỗi phổ biến và cách khắc phục chúng có thể giúp bạn duy trì tính nhất quán và độ tin cậy của dữ liệu.
8. Các 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 trữ một ngày giờ cố định không phụ thuộc vào múi giờ. Ví dụ, nó phù hợp để lưu trữ các ngày giờ không thay đổi ở bất kỳ múi giờ nào, chẳng hạn như ngày đặt chỗ hoặc thời gian sự kiện. Ngược lại, TIMESTAMP
được lưu trữ dựa trên 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ư ghi nhật ký.
Q2: Làm cách nào để lưu trữ giây thập phân với DATETIME
?
Khi tạo cột DATETIME
, bạn có thể đặt độ chính xác của giây thập phân bằng cách chỉ định giá trị fsp
. Ví dụ, chỉ định DATETIME(3)
sẽ cho phép bạn lưu trữ giây thập phân đến 3 chữ số. Khi chèn, bạn sử dụng giá trị có giây thập phân và nó sẽ được lưu trữ ở định dạng thích hợp.
Q3: Nên sử dụng DATETIME
hay TIMESTAMP
?
Tùy thuộc vào mục đích sử dụng. Nếu bạn muốn lưu trữ một ngày giờ cố định, hãy sử dụng DATETIME
. Ngược lại, đối với 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ư ngày tạo hoặc ngày cập nhật dữ liệu, hãy sử dụng TIMESTAMP
. TIMESTAMP
phù hợp khi cần hoạt động với các múi giờ khác nhau vì nó tự động chuyển đổi múi giờ.