很简单,我有一个问题:
@current_user.items.where('updated_at > ? AND updated_at < ?', last_sync_time_from_client, current_time)
我的问题是,我认为数据库中比较的时间和 last_sync_time_from_client
是在 float 基础上比较的。这总是导致 updated_at > last_sync_time_from_client
为真,即使时间与秒相同也是如此。
即
(db item)updated_at.to_f # 1541246811.022979
last_sync_time.to_f # 1541246811.0
这意味着精确到秒都相同的时间会返回奇怪的结果。有没有办法解决这个问题,或者我应该简单地向 last_sync_time_from_client 添加一秒钟以解决 Rails 在这里很奇怪的问题?
最佳答案
这里有三种解决方案。解决方案 1 是最好的(非破坏性的)。解决方案 2 和 3 直接影响数据库中的存储值,因此选择它需要您自担风险。
方案一
使用
date_trunc('second', updated_at);
而不是 updated_at
。
参见 the answer to "Discard millisecond part from timestamp"了解详情。
解决方案2
强制 Rails 始终以秒的精度更新时间戳,将亚秒部分截断为零。
方案三
将数据库中 updated_at
列的精度设置为秒,而不是默认的亚秒(如毫秒)。
参见 the answers to "how to change rails migration t.timestamps to use timestamp(0) without timezone
in postgres"了解如何使用 Rails 迁移。
关于ruby-on-rails - 比较 postgres 和 Rails 中的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53131535/