比较Postgres和Rails中的时间

时间:2018-11-03 12:57:18

标签: ruby-on-rails postgresql parsing time comparison

很简单,我有一个查询:

@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在这里很奇怪?

1 个答案:

答案 0 :(得分:2)

这是三种解决方案。解决方案1是最好的(无损)。解决方案2和3直接影响数据库中的存储值,因此选择此方法后果自负。

解决方案1 ​​

使用

date_trunc('second', updated_at);

而不是updated_at。 有关详细信息,请参见the answer to "Discard millisecond part from timestamp"

解决方案2

Force Rails总是以一秒的精度更新时间戳,将亚秒部分截断为零。

请参见an answer to "Is there a way to change Rails default timestamps to Y-m-d H:i:s (instead of Y-m-d H:i:s.u) or have laravel ignore decimal portion of Y-m-d H:i:s.u?"

解决方案3

将数据库中updated_at列的精度提高一秒,而不是默认的亚秒级(例如毫秒)。

有关如何通过Rails迁移参见the answers to "how to change rails migration t.timestamps to use timestamp(0) without timezone in postgres"