2010-03-28 20 views
19

Có lẽ nhiều lập trình viên muốn đặt câu hỏi này. đó là những gì là cuộc phiêu lưu của mỗi một trong những định dạng thời gian MySQL. và cái nào bạn thích sử dụng nó trong ứng dụng của mình.MySQL: Cách tốt nhất để sử dụng, Unix TimeStamp hoặc DATETIME

Đối với tôi, tôi sử dụng dấu thời gian Unix vì có lẽ tôi thấy dễ dàng chuyển đổi & hồ sơ đặt hàng với nó và cũng vì tôi chưa bao giờ thử điều DATETIME. nhưng dù sao tôi cũng sẵn sàng thay đổi suy nghĩ của mình nếu có ai đó nói với tôi rằng tôi sai.

Cảm ơn

+0

Tương tự: http://stackoverflow.com/questions/409286/datetime-vs-timestamp –

Trả lời

16

Timestamp (cả những PHP và MySQL những nhân) được lưu trữ sử dụng 32 bit (ví dụ: 4 byte) số nguyên; có nghĩa là họ được giới hạn trong một phạm vi ngày mà đi từ năm 1970 đến 2038.

DATETIME không có giới hạn đó - nhưng được lưu trữ sử dụng nhiều byte (8 byte, nếu tôi không nhầm)


Sau đó, giữa lưu trữ timestamps như đã thấy bằng PHP, hoặc timestamps như được thấy bởi MySQL:


Và, để biết thêm thông tin giữa MySQL của TIMESTAMPDATETIME kiểu dữ liệu, xem 10.3.1. The DATETIME, DATE, and TIMESTAMP Types

+3

Chúng bị giới hạn _now_ đến 32 bit :) –

+4

Ai đang sử dụng hệ thống 32 bit vào năm 2038? –

+0

'new java.util.Date(). GetTime()' đã là 64 bit. – osa

1

Trừ khi số hóa hồ sơ trước ngày 01 Tháng 1 năm 1970, Tôi thích kỷ nguyên UNIX. Nó chỉ là một vấn đề ưu tiên, toàn bộ số unsigned là đơn giản để đối phó với khi sử dụng nhiều ngôn ngữ.

Chỉ cần ghi nhớ, thời đại bắt đầu vào ngày 1 tháng 1 năm 1970. Rất nhiều công ty đã hoạt động trong nhiều thập kỷ, nếu không lâu hơn trước đó.

+0

Dấu thời gian Unix, trong một số nguyên 32 bit đã ký, có thể lưu trữ ngày trở lại năm 1901, vì nó có thể kéo dài từ -2147483647 (ngày 13 tháng 12 năm 1901 8:45:53 CH UTC) đến 2147483647 (Ngày 19 tháng 1, 2038 3:14:07 AM UTC) –

9

Như những người khác đã nói, dấu thời gian có thể đại diện cho phạm vi thời gian biểu nhỏ hơn (từ 1970 đến 2038). Tuy nhiên, dấu thời gian đo số giây kể từ Thời đại Unix (1970-01-01 00:00:00 UTC), do đó làm cho chúng độc lập với múi giờ, trong khi DATETIME lưu trữ ngày và giờ mà không có múi giờ. Nói cách khác, dấu thời gian rõ ràng tham chiếu một điểm cụ thể trong thời gian, trong khi điểm chính xác trong thời gian DATETIME đề cập đến yêu cầu múi giờ (không được lưu trữ trong trường DATETIME). Để xem lý do tại sao điều này có thể quan trọng, hãy xem xét điều gì sẽ xảy ra nếu chúng tôi thay đổi múi giờ của mình.

Giả sử chúng tôi muốn lưu trữ ngày giờ 2010-03-27 12:00 UTC. Nếu chúng ta lưu trữ và lấy nó bằng cách sử dụng một dấu thời gian hoặc DATETIME, thì thường có vẻ không có sự khác biệt. Tuy nhiên, nếu máy chủ hiện thay đổi để múi giờ địa phương là UTC + 01, thì chúng tôi sẽ nhận được hai kết quả khác nhau nếu chúng tôi lấy ra ngày giờ.

Nếu chúng ta đặt trường thành DATETIME, nó sẽ báo cáo ngày giờ là 2010-03-27 12:00, mặc dù thay đổi múi giờ. Nếu chúng ta đặt trường thành dấu thời gian, ngày sẽ được báo cáo là 2010-03-27 11:00. Đây không phải là vấn đề với một trong hai kiểu dữ liệu - nó chỉ là kết quả của việc chúng lưu trữ thông tin hơi khác nhau.

+0

Dấu thời gian Unix, trong một số nguyên 32 bit đã ký, có thể lưu trữ ngày tháng trở lại năm 1901, vì nó có thể kéo dài từ -2147483647 (ngày 13 tháng 12 năm 1901 8:45:53 PM UTC) tới 2147483647 (Ngày 19 tháng 1, 2038 3:14:07 SA UTC) –

2

Điều đó thực sự phụ thuộc.Tôi sẽ cung cấp cho bạn 2 ví dụ về cách khắc phục sự cố khác:

Dấu thời gian tốt hơn DATETIME khi bạn muốn lưu phiên người dùng trong cơ sở dữ liệu và thời gian tạo phiên (trong định dạng Dấu thời gian) được sử dụng để truy xuất hàng nhanh (với mục lục).
Ví dụ: bảng có thể trông giống như sau:
[session_create_time AS Timestamp][IP_address AS 32bit Int][etc...]
Có chỉ mục trên hai cột đầu tiên thực sự có thể tăng tốc truy vấn của bạn. Nếu bạn có loại giá trị DATETIME cho trường session_create_time thì có thể mất nhiều thời gian hơn. Xem xét các truy vấn phiên được thực hiện mỗi khi người dùng yêu cầu một trang, vì vậy hiệu quả là rất quan trọng.

DATETIME tốt hơn Dấu thời gian khi bạn muốn lưu trữ ngày sinh của người dùng hoặc một số sự kiện lịch sử yêu cầu phạm vi thời gian linh hoạt.

+0

Dấu thời gian Unix, trong một số nguyên 32 bit có dấu, có thể lưu trữ ngày trở lại năm 1901, vì nó có thể kéo dài từ -2147483647 (ngày 13 tháng 12, 1901 8:45:53 PM UTC) đến 2147483647 (19 tháng 1, 2038 3:14:07 SA UTC). Vì vậy, trừ khi bạn đang lưu trữ một ngày trước năm 1901, một dấu thời gian sẽ hoạt động. –

Các vấn đề liên quan