活动记录:使用 where 子句时不考虑毫秒



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

updated_at datetime具有以毫秒为单位的精度,这意味着

Model.updated_at.to_f

返回类似"1368977381.063427"的内容。它被格式化为"2013-05-19T15:29:41.063427000Z"发送到客户端。

问题是,当我从客户端得到datetime返回时,解析它并使用它查询,毫秒丢失。

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"))

你也可以通过以下设置(即在初始化器中)将此格式设置为数据库中DateTime的标准格式:

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

则您的原始查询再次工作:

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

参见Rails API的DateTime.to_s (aka .to_formated_s)

如果您正在使用ISO8601标准,您可以使用.iso8601(10)。不知道为什么,但它的四舍五入为秒默认

相关内容

最新更新