数组sql中最近的一天

数组sql中最近的一天,sql,ruby-on-rails,ruby,postgresql,date,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 = [nex

我正试图找到一张唱片,并在当天的基础上按壁橱日订购

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

说约翰想知道他下一步什么时候要教书。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

为了获得第二天排序的顶部,您需要按照与当天的距离进行排序

不幸的是,
%
(带postgresql的模运算符)保留了符号 用于负值。因此,您不能使用
day-current\u day

但以下表达式上的排序将根据您预期的逻辑对行进行排序:

(7 + day - current_day) % 7
其中,
day
是模型行中的日期,
current\u day
是用于计算的当前日期的值

如果你喜欢一个更明确的解决方案,你可以求助于

CASE WHEN day < current_day THEN 7 + day - current_day ELSE day - current_day END
当一天<当前\u天然后是7+天-当前\u天其他天-当前\u天结束时的情况

要获得第二天的排序结果,您需要根据与当天的距离进行排序

不幸的是,
%
(带postgresql的模运算符)保留了符号 用于负值。因此,您不能使用
day-current\u day

但以下表达式上的排序将根据您预期的逻辑对行进行排序:

(7 + day - current_day) % 7
其中,
day
是模型行中的日期,
current\u day
是用于计算的当前日期的值

如果你喜欢一个更明确的解决方案,你可以求助于

CASE WHEN day < current_day THEN 7 + day - current_day ELSE day - current_day END
当一天<当前\u天然后是7+天-当前\u天其他天-当前\u天结束时的情况

为了避免复杂的解决方案,我宁愿选择所有工作日,并用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

为了避免复杂的解决方案,我宁愿选择所有工作日,并使用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

下面的代码将找到下一个即将到来的日子,如果您需要几天,请删除

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

下面的代码将找到下一个即将到来的日子,如果您需要几天,请删除

next_day = TeamOverview.where("day > ? and coach_id = ?", current_day, current_user.id).order("day").first
(res=TeamOverview.where(coach:current_user.id).顺序(“day”).find(:first,:conditions=>[(day>?)”,current_day]))?res:TeamOverview.where(coach:current_user.id).顺序(“day”).find(:first,:conditions=>[(day<?),current_day]))
这将为您提供所需的结果(res=TeamOverview.where(coach:current\u user.id)。order(“day”)。find(:first,:conditions=>[(day>?)”,current\u day])?res TeamOverview.where(coach:current\u user.id)。order(“day”)。find(:first,:conditions=>[(day<?),current\u day]))

这将为您提供所需的结果

您可以在纯
SQL
中通过两部分排序实现这一点:

SELECT *
FROM team_overviews
ORDER BY day < (current_day), day
或者,如果您愿意:

TeamOverview
  .where(coach: current_user.id)
  .order("day < #{current_day}, day")
TeamOverview
.where(coach:current_user.id)
.order(“日<{当前日},日”)
警告:上述代码可能容易受到SQL注入的攻击。请确保您信任
当前\u日期的来源,并在必要时进行清理(在这种情况下,可能只需调用
来\u i


不幸的是,(从发布时的当前
4.2.6
版本来看,
语法似乎不受
order
ActiveRecord方法的支持,即以下内容无效:
TeamOverview.order(“day
。这可能是对库的一个很好的补充。

您可以在纯
SQL
中通过两部分排序实现这一点:

SELECT *
FROM team_overviews
ORDER BY day < (current_day), day
或者,如果您愿意:

TeamOverview
  .where(coach: current_user.id)
  .order("day < #{current_day}, day")
TeamOverview
.where(coach:current_user.id)
.order(“日<{当前日},日”)
警告:上述代码可能容易受到SQL注入的攻击。请确保您信任
当前\u日期的来源,并在必要时进行清理(在这种情况下,可能只需调用
来\u i


不幸的是,(从发布时的当前
4.2.6
版本来看,
语法似乎不受
order
ActiveRecord方法的支持,即以下内容无效:
TeamOverview.order(“day
。也许这是对库的一个很好的补充。

天会像[0,2,4,0,1]一样重复吗?@chaitanya不,你可以把它当作一个集合,每个事件只出现一次。天会像[0,2,4,0,1]一样重复吗?@chaitanya不,你可以将其视为一个集合,每次出现都只在我不确定如何将其合并到order语句中?我不确定如何将其合并到order语句中?这给了我一个错误:PG::UndefinedFunction:错误:运算符不存在:字符变化>整数这没有抓住要点.
next\u day
可能比
current\u day
小。这就是问题的根源。这给了我一个错误:PG::undefinedffunction:error:operator不存在:character variaging>integer这没有抓住重点。
next\u day
可能比
current\u day
小。这首先是什么让这个问题成了问题,这不是val