2010-10-13 40 views
364

Theo kinh nghiệm của tôi, nhận được ngày/giờ ngay khi lập trình luôn đầy nguy hiểm và difficulity.Trong Ruby on Rails, sự khác nhau giữa DateTime, Dấu thời gian, Thời gian và Ngày tháng là gì?

Ruby và Rails đã luôn luôn bỏ qua tôi về điều này, nếu chỉ do số lượng áp đảo các tùy chọn; Tôi không bao giờ có bất kỳ ý tưởng nào mà tôi nên chọn.

Khi tôi đang sử dụng Rails và nhìn vào kiểu dữ liệu ActiveRecord Tôi có thể tìm thấy những điều sau

: datetime,: timestamp,: thời gian, và: ngày

và không có ý tưởng những gì sự khác biệt là hoặc nơi gotchas ẩn nấp.

Sự khác biệt là gì? Bạn sử dụng chúng để làm gì?

(T.B. Tôi đang sử dụng Rails3)

Trả lời

508

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, TIMETIMESTAMP cột; giống như bạn có CHAR, VARCHAR, FLOATINTEGER.

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 DATETIMETIMESTAMP 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 TIMESTAMPtrô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:datetime sẽ mặc định là DATETIME, trong khi :date:time tương ứng với DATETIME, 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.

+6

Để 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

+27

@ 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

+9

Đâ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

1
  1. : datetime (8 byte)

    • Stores Date and Time định dạng YYYY-MM-DD HH: MM: SS
    • hữu ích cho các cột như birth_date
  2. : dấu thời gian (4 byte)

    • Lưu trữ numbe r giây kể từ 1970-01-01
    • hữu ích cho các cột như updated_at, created_at
  3. : ngày (3 byte)
    • Stores Ngày
  4. : thời gian (3 byte)
    • Thời gian cửa hàng
Các vấn đề liên quan