【问题标题】:Ruby datetime suitable for mysql comparison适合mysql比较的Ruby datetime
【发布时间】:2010-11-18 08:45:21
【问题描述】:

Rails 可以自动在 MySql 中插入正确格式化的日期时间,而无需我多加考虑。

但是,为了进行验证,我需要检查存储的 mysql 日期时间值(即 2008-07-02 18:00:00)是否大于或小于“现在”。我可以打电话给DateTime.nowTime.now 但是我怎样才能把它转换成mysql喜欢的格式呢?

谢谢

【问题讨论】:

    标签: mysql ruby-on-rails ruby datetime


    【解决方案1】:

    您可以使用to_s(:db) 转换为数据库友好格式。

    Time.now.to_s(:db)
    

    但是,如果您在 Rails 中指定了时区,请小心,因为时间将以 UTC 格式存储在数据库中。您需要指定它才能进行正确的比较。

    Time.now.utc.to_s(:db)
    

    您也可以在 MySQL 中使用 NOW() 函数,而不是在 Ruby 中生成当前时间。

    【讨论】:

    • 谢谢。让 railscasts 的人回答你的问题真是太棒了:)
    • 这确实应该是rails中的一个方法!
    • 100 谢谢。这个答案让我想起了 NOW() 的存在。 ActiveRecord 肯定把我宠坏了。因为我几乎不再接触 SQL,所以我一直在通过 Time.now。手动调整 SQL 的日子已经一去不复返了(至少对我而言)。
    • 完美!感谢@ryanb 的解决方案!而且 railscasts 是最好的!
    • 非常感谢。这正是我所需要的!似乎差异是由于 SQL 缺乏 ISO 8061 合规性,msdn.microsoft.com/en-us/library/ms187819.aspx Re: SQL“日期时间不符合 ANSI 或 ISO 8601。”
    【解决方案2】:

    你不需要。让 Rails 为您完成工作:

    如果您的模型是Widget,这将找到在最后一天创建的所有小部件:

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

    Rails 会自动将时间戳转换为正确的格式。

    【讨论】:

    • 感谢您的回复,但这不适合我的用例。我已经从数据库中检索了我的对象。在检索到它很久之后,我需要对其运行基于时间的验证,因此必须在 Ruby 代码中而不是在查询中进行检查。不过再次感谢。
    • 我有一个不同的场景,而且效果很好。谢谢。
    • 在 Rails 4+ 中只需使用 Thing.where('created_at > ?', 6.months.ago)
    猜你喜欢
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2020-09-15
    • 2015-10-18
    • 2011-01-11
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多