ActiveRecord:使用 where 子句时不考虑毫秒

2023-11-22

我正在开发一个带有 Rails api 和 iOS 客户端的项目,使用 Updated_at 字段作为参考来检测服务器上最后一次从客户端拉取后发生的修改。

Updated_at 日期时间的精度以毫秒为单位,这意味着

Model.updated_at.to_f

返回类似“1368977381.063427”的内容。 该信息以“2013-05-19T15:29:41.063427000Z”的格式发送到客户端。

问题是,当我从客户端获取该日期时间、解析它并用它查询时,毫秒就会丢失。

last_update = DateTime.strptime("2013-05-19T15:29:41.063427000Z", "%Y-%m-%dT%H:%M:%S.%N%z")
Model.where("updated_at > ?", last_update)

和做一样好

last_update = DateTime.strptime("2013-05-19T15:29:41Z", "%Y-%m-%dT%H:%M:%S%z")
Model.where("updated_at > ?", last_update)

结果,当我应该得不到任何结果时,我总是至少得到一个结果,因为毫秒被截断了。

我如何在查询中考虑这些因素?


Try

Model.where("updated_at > ?", last_update.strftime("%Y-%m-%dT%H:%M:%S.%N%z"))

您还可以通过设置(即在初始化程序中)将此格式设置为数据库中日期时间的标准格式:

Time::DATE_FORMATS[:db]= '%Y-%m-%dT%H:%M:%S.%N%z'

然后你原来的查询再次起作用:

Model.where("updated_at > ?", last_update)

See the 导轨API for DateTime.to_s(又名 .to_formated_s)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ActiveRecord:使用 where 子句时不考虑毫秒 的相关文章

随机推荐