Ruby日期时间适用于MySQL比较

42

Rails对于在 MySql 中自动插入格式正确的日期时间非常好,无需我过多考虑。

然而,为了进行验证,我需要检查存储在mysql中的datetime值(即2008-07-02 18:00:00)是大于还是小于“现在”。我可以调用DateTime.nowTime.now,但如何将其转换为mysql所支持的格式呢?

谢谢

2个回答

109

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

Time.now.to_s(:db)

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

Time.now.utc.to_s(:db)
你还可以在MySQL中使用NOW()函数来代替在Ruby中生成当前时间。

17
谢谢。能够让 Railscasts 的创作者回答你的问题真是太棒了 :) - user94154
1
这真的应该是Rails中的一个方法! - Hopstream
100谢谢。这个回答让我想起了NOW()的存在。 ActiveRecord确实宠坏了我。我几乎不再接触SQL,所以我一直在传递Time.now。手动调整SQL的日子已经过去了(至少对我来说是这样)。 - Swartz
太好了!感谢@ryanb提供的解决方案!而railscasts是最棒的! - abhir
非常感谢。这正是我所需要的!似乎差异来自于SQL缺乏ISO 8061的兼容性,https://msdn.microsoft.com/en-us/library/ms187819.aspx 关于SQL“datetime不符合ANSI或ISO 8601标准”的问题。 - aaron-coding
这对我来说并不完全有效。我必须使用 ActiveRecord::Base.sanitize(time) 来获得所需的格式。(当然需要 ActiveRecord,因此大多适用于 Rails) - yuval

6
你不需要这么做,让Rails来处理吧:
如果你的模型是Widget,这将找到在过去的一天内创建的所有小部件:
Thing.find(:all, :condition => ["created_at > ?", Time.now - 1.day])

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

谢谢您的回复,但这并不适合我的用例。我已经从数据库中检索到了我的对象。在它被检索出来很久之后,我需要对其进行基于时间的验证,因此必须在Ruby代码中进行检查,而不是在查询中进行。再次感谢。 - user94154
我有一个不同的情景,这个方法完美地解决了它。谢谢。 - aronchick
在Rails 4+中,只需使用Thing.where('created_at > ?', 6.months.ago) - Sandro L
请注意上面的评论6.months.ago和原始建议中的Time.now - 1.day也不同,因为它们使用不同的参考时间。Time.now使用系统时间,这可能不是.ago比较的时间,这取决于应用程序配置、TZ环境变量等。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接