Sự khác biệt giữa các định dạng ngày/thời gian khác nhau trong ActiveRecord có ít để làm với Rails và tất cả mọi thứ để làm với bất cứ điều gì cơ sở dữ liệu bạn đang sử dụng.
Sử dụng MySQL làm ví dụ (nếu không vì lý do nào khác vì nó phổ biến nhất), bạn có các loại dữ liệu cột DATE
, DATETIME
, TIME
và TIMESTAMP
cột; giống như bạn có CHAR
, VARCHAR
, FLOAT
và INTEGER
.
Vì vậy, bạn hỏi, sự khác biệt là gì? Vâng, một số trong số đó là tự giải thích. DATE
chỉ lưu trữ ngày, TIME
chỉ lưu trữ thời gian trong ngày, trong khi DATETIME
lưu trữ cả hai.
Sự khác biệt giữa DATETIME
và TIMESTAMP
tinh vi hơn một chút: DATETIME
được định dạng là YYYY-MM-DD HH:MM:SS
. Phạm vi hợp lệ đi từ năm 1000 đến năm 9999 (và mọi thứ ở giữa. Trong khi TIMESTAMP
trông giống tương tự khi bạn tìm nạp nó từ cơ sở dữ liệu, nó thực sự chỉ là một mặt trước cho một unix timestamp. Phạm vi hợp lệ của nó đi từ 1970 đến 2038. Bởi vì DATETIME
lưu trữ mọi chữ số trong năm, ngày tháng, giờ, phút và giây, nó sử dụng hết 8 byte. Như TIMESTAMP
chỉ lưu trữ số giây kể từ 1970/01/01, nó sử dụng 4 byte.
Bạn có thể đọc thêm về sự khác biệt giữa các định dạng thời gian trong MySQL here.
Cuối cùng, nó đi xuống đến những gì bạn cần cột ngày/giờ của bạn để làm. Bạn có cần lưu trữ ngày và giờ trước năm 1970 hoặc sau năm 2038 không? Sử dụng DATETIME
. Bạn có cần phải lo lắng về kích thước cơ sở dữ liệu và bạn đang ở trong timerange đó? Sử dụng TIMESTAMP
. Bạn chỉ cần lưu trữ một ngày? Sử dụng DATE
. Bạn chỉ cần lưu trữ thời gian? Sử dụng TIME
.
Đã nói tất cả điều này, Đường ray thực sự đưa ra một số quyết định này cho bạn. Cả hai :timestamp
và :datetime
sẽ mặc định là DATETIME
, trong khi :date
và :time
tương ứng với DATE
và TIME
, tương ứng.
Điều này có nghĩa là trong Rails, bạn chỉ phải quyết định xem bạn có cần lưu trữ ngày, giờ hoặc cả hai hay không.
Để lưu nội dung, tôi thích dấu thời gian tuyệt đối (unix) vì định dạng YYYY-MM-DD phụ thuộc vào múi giờ được sử dụng. Vì vậy, khách hàng cần phải biết múi giờ của máy chủ và cần phải thực hiện chuyển đổi. Dấu thời gian tuyệt đối từ giây đến năm 1970 không có vấn đề đó. – n13
@ n13 Điểm tốt, nhưng không thực sự là một vấn đề trong Rails, vì nó chuyển đổi sang UTC trước khi chèn datetimes vào cơ sở dữ liệu. – vonconrad
Đây là một trong những bài viết hữu ích nhất trong vũ trụ Rails. Điều này nên được thêm vào các hướng dẫn đường ray ... – Andrew