ruby-on-rails - 比较 postgres 和 Rails 中的时间

标签 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 是在 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 始终以秒的精度更新时间戳,将亚秒部分截断为零。

参见 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?"

方案三

将数据库中 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/

相关文章:

mysql - 如何在 ruby​​ on rails 中向表列添加唯一性

sql - 按最匹配的记录排序

python - 使用 Pytest 在函数中模拟引发异常

javascript - 如何使用 f.select 获取静态哈希值?

ruby-on-rails - Rails minitest 设计错误

ruby-on-rails - 没有ActiveRecord的文件上传

sql - 在不使用子查询的情况下从同一个表中的正则表达式匹配更新

php - 提高性能、PHP/JSON 解析和 MySQL 编写的建议 - 多个 JSON

php - 如何将 Camel Case 解析为人类可读的字符串?

java - 在对话框中将字符串转换为 double