Phạm vi:
Luôn có nhược điểm rõ ràng:Phạm vi mà bạn có thể lưu trữ bị giới hạn từ năm 1970 đến năm 2038. Nếu bạn cần lưu trữ ngày bên ngoài phạm vi này, bạn thường cần sử dụng định dạng khác. Trường hợp phổ biến nhất mà tôi đã tìm thấy khi điều này áp dụng cho ngày sinh.
Khả năng đọc:
Tôi nghĩ rằng lý do quan trọng nhất mà mọi người đã chọn sử dụng một trong những kiểu ngày tháng tích hợp sẵn để dữ liệu dễ diễn giải hơn. Bạn có thể thực hiện một lựa chọn đơn giản và hiểu các giá trị mà không cần phải định dạng thêm phản hồi.
Chỉ mục:
Một lý do kỹ thuật tốt để sử dụng các loại ngày là nó cho phép truy vấn được lập chỉ mục trong một số trường hợp mà dấu thời gian unix thì không. Hãy xem xét truy vấn sau:
SELECT * FROM tbl WHERE year(mydate_field) = 2009;
Nếu mydate_field thuộc loại ngày tháng và có một chỉ mục trên trường, truy vấn này sẽ thực sự sử dụng một chỉ mục, bất chấp lệnh gọi hàm. Đây là khoảng thời gian duy nhất mà mysql có thể tối ưu hóa các lệnh gọi hàm trên các trường như thế này. Truy vấn tương ứng trên trường dấu thời gian sẽ không thể sử dụng các chỉ số:
SELECT * FROM tbl WHERE year(from_unixtime(mytimestamp_field)) = 2009;
Tuy nhiên, nếu bạn nghĩ về nó một chút, vẫn có một cách để giải quyết vấn đề đó. Truy vấn này thực hiện điều tương tự và sẽ có thể sử dụng tối ưu hóa chỉ mục:
SELECT * FROM tbl WHERE mytimestamp_field > unix_timestamp("2009-01-01") AND mytimestamp_field < unix_timestamp("2010-01-01");
Tính toán:
Nói chung, tôi lưu trữ ngày tháng dưới dạng thời gian unix, mặc dù có những nhược điểm. Điều này không thực sự dựa trên thành tích của nó, mà là vì tôi đã quen với nó. Tôi thấy rằng điều này đơn giản hóa một số tính toán, nhưng làm phức tạp những tính toán khác. Ví dụ:rất khó để thêm một tháng vào dấu thời gian unix vì số giây mỗi tháng thay đổi. Điều này rất dễ dàng bằng cách sử dụng hàm mysql DATE_ADD (). Tuy nhiên, tôi nghĩ rằng trong hầu hết các trường hợp, nó thực sự đơn giản hóa các phép tính. Ví dụ:khá phổ biến khi bạn muốn chọn các bài đăng trong hai ngày qua. Nếu trường chứa dấu thời gian unix thì việc này có thể được thực hiện dễ dàng bằng cách thực hiện:
SELECT * FROM tbl WHERE mytimestamp_field > time() - 2*24*3600;
Đó có thể là vấn đề của sở thích, nhưng cá nhân tôi thấy điều này nhanh hơn và dễ dàng hơn so với việc phải ghi nhớ cú pháp của một hàm chẳng hạn như DATE_SUB ().
Múi giờ:
Dấu thời gian Unix không thể lưu trữ dữ liệu múi giờ. Tôi sống ở Thụy Điển, nơi có một múi giờ duy nhất, vì vậy đây thực sự không phải là vấn đề đối với tôi. Tuy nhiên, đó có thể là một khó khăn lớn nếu bạn sống ở một quốc gia trải dài trên nhiều múi giờ.