2009-08-10 39 views
32

Rails đã được tốt với tự động chèn datetimes định dạng chính xác trong MySql mà không cần cho tôi để cho nó nhiều suy nghĩ.Ruby datetime phù hợp cho so sánh mysql

Tuy nhiên, để thực hiện xác thực, tôi cần kiểm tra xem giá trị datetime mysql đã lưu trữ (tức là 2008-07-02 18:00:00) có lớn hơn hoặc nhỏ hơn "hiện tại" hay không. Tôi có thể gọi DateTime.now hoặc Time.now nhưng làm thế nào tôi có thể chuyển đổi thành định dạng mysql thích?

Cảm ơn

Trả lời

83

Bạn có thể sử dụng to_s(:db) để chuyển đổi sang một định dạng thân thiện với cơ sở dữ liệu.

Time.now.to_s(:db) 

Tuy nhiên, hãy cẩn thận nếu bạn có múi giờ được chỉ định trong Rails vì thời gian sẽ được lưu trữ trong UTC trong cơ sở dữ liệu. Bạn sẽ cần xác định điều đó để so sánh đúng.

Time.now.utc.to_s(:db) 

Bạn cũng có thể sử dụng chức năng NOW() trong MySQL thay vì tạo thời gian hiện tại trong Ruby.

+15

cảm ơn. tuyệt vời của nó để có chàng railscasts trả lời câu hỏi của bạn :) – user94154

+1

Điều này thực sự nên là một phương pháp trong đường ray! – Hopstream

+0

100 cảm ơn. Câu trả lời này chỉ nhắc tôi nhớ đến sự tồn tại của NOW(). ActiveRecord chắc chắn đã làm hỏng tôi. Tôi đã vượt qua Time.now vì tôi hầu như không chạm vào SQL nữa. Đi là những ngày của SQL điều chỉnh tay (ít nhất là đối với tôi). – Swartz

5

Bạn không cần. Hãy Rails làm việc cho bạn:

Nếu mô hình của bạn là Widget này sẽ tìm thấy tất cả các vật dụng đã được tạo ra trong ngày cuối cùng:

Thing.find(:all, :condition => ["created_at > ?", Time.now - 1.day]) 

Rails sẽ tự động chuyển đổi các dấu thời gian vào đúng định dạng.

+0

cảm ơn cho phản ứng nhưng điều này không phù hợp với trường hợp sử dụng của tôi. Tôi đã có đối tượng của tôi lấy từ DB. Lâu sau khi nó được lấy ra, tôi cần phải chạy một xác nhận dựa trên thời gian trên nó để kiểm tra phải được thực hiện trong mã Ruby và không phải trong một truy vấn. Cảm ơn một lần nữa mặc dù. – user94154

+0

Tôi đã có một kịch bản khác, và điều này làm việc hoàn hảo. Cảm ơn. – aronchick

+0

Trong Rails 4+ chỉ sử dụng 'Thing.where ('created_at>?', 6.months.ago)' –