很简单,我有一个查询:
@current_user.items.where('updated_at > ? AND updated_at < ?', last_sync_time_from_client, current_time)
我的问题是,我认为正在比较数据库中的时间和last_sync_time_from_client
是基于浮动的。即使时间等于秒,这始终会导致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在这里很奇怪?
答案 0 :(得分:2)
这是三种解决方案。解决方案1是最好的(无损)。解决方案2和3直接影响数据库中的存储值,因此选择此方法后果自负。
使用
date_trunc('second', updated_at);
而不是updated_at
。
有关详细信息,请参见the answer to "Discard millisecond part from timestamp"。
Force Rails总是以一秒的精度更新时间戳,将亚秒部分截断为零。
将数据库中updated_at
列的精度提高一秒,而不是默认的亚秒级(例如毫秒)。
有关如何通过Rails迁移参见the answers to "how to change rails migration t.timestamps to use timestamp(0) without timezone
in postgres"。