【问题标题】:Rails - how to fetch from database the closest records according to date?Rails - 如何根据日期从数据库中获取最接近的记录?
【发布时间】:2013-02-26 23:32:56
【问题描述】:

我在数据库中存储了这样的记录:

ID| date_column
1 | 2013-02-10 10:00:00
2 | 2013-02-10 11:00:00
3 | 2013-02-10 12:00:00
4 | 2013-02-10 13:00:00
5 | 2013-02-11 14:00:00
6 | 2013-02-11 22:00:00

我正在尝试获取 3 条记录,它们是最接近今天日期的记录。例如,假设今天是2013-02-10,所以我需要获取今天日期的 3 条记录(2013-02-10 11:00:002013-02-10 12:00:002013-02-10 13:00:00),但是例如如果今天是2013-02-15,我需要获取最接近的 3 条记录,在本例中分别是 2013-02-10 13:00:002013-02-11 14:00:002013-02-11 22:00:00?

请你帮帮我,怎么做?

谢谢

【问题讨论】:

  • 你是通过 SQL 还是 Active Record 做的?
  • @JackMarchetti 通过 ActiveRecord。
  • K.在下面查看我的答案,应该可以为您解决。

标签: sql ruby-on-rails ruby date


【解决方案1】:

假设您使用的是 ActiveRecord,对吗?

此查询将获取过去中最接近“现在”的三个日期:

time_to_check = Time.now
TableObjectName.where("date_column <= ?", time_to_check ).limit(3).order("date_column desc")

此查询将获取未来中最接近“现在”的三个日期:

TableObjectName.where("date_column >= ?", time_to_check ).limit(3).order("date_column desc")

我唯一能想到的,这似乎效率低下,但我想不出一种 SQL 方法,你现在有两个数组,基本上有六个记录。

未来三个(如果有的话) 过去三个(如果有的话)。

然后我将遍历每个记录并比较来自timeToCheck 变量的每条记录之间经过了多少时间。

哪三个具有最小的时间差,将它们添加到您的最终数组中。

【讨论】:

  • 嗯,但是如果今天是 2013-02-27 并且在数据库中是 2013-02-262013-02-272013-02-282013-02-29,那么我将需要获取最接近今天日期的 3 条记录...而查询对此不起作用
  • 所以你可能在数据库中也有未来的日期?
  • 是的,还有未来的日期。
  • 好的,我已经更新了我的答案。不确定这是最有效的方法,但我想不出一个查询可以做到这一点。
  • 这有点复杂......可能我将不得不以与您上面提到的类似的方式来做。谢谢。
【解决方案2】:

这将使 3 次接近特定时间,我在您的目标日期使用中午。这将确保今天的结果领先于其他任何一天。

TableObjectName.all(order: "abs(timediff('2013-02-10 12:00:00', date_column))", limit: 3).

【讨论】:

  • 但这不适用于 PostgreSQL 数据库,或者? timediff那里支持吗?
  • 因为当我尝试你的样品时,我得到了PGError: ERROR: function timediff(unknown, timestamp without time zone) does not exist
  • 我手边没有 PostgreSQL 服务器,但我相信你可以将 "timediff('2013-02-10 12:00:00', date_column)" 替换为 "'2013-02- 10 12:00:00' - PostgreSQL 中的 date_column"。 (我的例子在 mysql 中工作)
猜你喜欢
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 2019-05-22
  • 1970-01-01
相关资源
最近更新 更多