最近的一天在数组sql中

时间:2016-06-02 11:14:16

标签: sql ruby-on-rails ruby postgresql date

我正在尝试查找记录并根据当天的壁橱日订购。

让我试着用一个例子来说明。

说约翰想知道接下来要教的时间。 John教导接下来几天(天数转换为数字,其中0 =星期日,1 =星期一......) [1,2] 。当前日期是星期五(5),因此结果应 1

另一个例子:

Karen想知道她下次要教的时间。凯伦在接下来的几天教授 [0,2,3] 。当天是星期四(4),因此结果应为 0

当前查询:

TeamOverview.where(coach: current_user.id).order(:day = [next closets day missing here])

型号:

  t.string  :name
  t.integer :coach
  t.int     :day

模型中可能的记录:

 id: 1, name: John,  day: 1
 id: 2, name: John,  day: 2
 id: 3, name: Karen, day: 0
 id: 4, name: Karen, day: 2
 id: 5, name: Karen, day: 3

5 个答案:

答案 0 :(得分:1)

为了避免复杂的解决方案,我宁愿选择所有工作日并在ruby中完成工作。查询的最大结果数为7 - 应该没问题。此外,您已经有了这样的查询(可能在TeamOverview范围内)的变化很大,您可以重复使用它,并且在第二次调用时它也可能来自查询缓存。

working_days = TeamOverview.where(coach: current_user.id).pluck(:day)
working_days.find { |day_num| day_num > today_num } || working_days.first

答案 1 :(得分:0)

为了让第二天排序最高,您需要按当天的距离订购。

不幸的是,%(使用postgresql的模运算符保留了符号 对于负值。因此,您无法使用day - current_day

但是下面表达式的排序将根据你的内部逻辑对行进行排序:

(7 + day - current_day) % 7

WHere day是模型行的日期,current_day是当前日期用于计算的值。

如果您更喜欢更明确的解决方案,可以转向

CASE WHEN day < current_day THEN 7 + day - current_day ELSE day - current_day END

答案 2 :(得分:0)

(res =TeamOverview.where(coach: current_user.id).order("day").find(:first, :conditions => [ "(day > ? )",current_day]) ) ? res : TeamOverview.where(coach: current_user.id).order("day").find(:first, :conditions => [ "(day < ? )",current_day])

这将为您提供所需的结果

答案 3 :(得分:0)

您可以使用两部分顺序在纯SQL中实现此目的:

SELECT *
FROM team_overviews
ORDER BY day < (current_day), day

ActiveRecord中的一个简单实现是:

TeamOverview
  .where(coach: current_user.id)
  .order("day < #{current_day}")
  .order(:day)

或者,如果您愿意:

TeamOverview
  .where(coach: current_user.id)
  .order("day < #{current_day}, day")

警告:上述代码可能容易受到SQL注入攻击。确保您信任current_day的来源,并在必要时进行清理(在这种情况下,可能只需致电to_i)。

不幸的是,looking at the rails source code(截至发布时的当前4.2.6版本),? ActiveRecord方法似乎不支持order语法 - 即以下内容无效:TeamOverview.order("day < ?", current_day)。也许这对图书馆来说是一个很好的补充。

答案 4 :(得分:-1)

以下代码将在下一个即将到来的日期找到,如果您需要几天,则删除.first参数

next_day = TeamOverview.where("day > ? and coach_id = ?", current_day, current_user.id).order("day").first