Sql rails按时间顺序排列,24小时周期颠倒

Sql rails按时间顺序排列,24小时周期颠倒,sql,ruby-on-rails,ruby-on-rails-3,postgresql,ruby-on-rails-4,Sql,Ruby On Rails,Ruby On Rails 3,Postgresql,Ruby On Rails 4,我有一个存储事件的模型,每个事件都有一个开始时间 开始时间由rails作为时间处理,但在Postgres中存储为datetime(我假设),rails只是忽略日期并将其存储为2000-01-01 我的问题是,对它进行排序,以便在午夜之后开始的事件在之后而不是之前出现。我怎样才能对它们进行不同的分类,并在24小时内对事件进行分割,以便第一个上午12小时的事件在第二个下午的事件之后出现。(如果是这样的话) 有什么想法吗 c=Event.last c.event_items.order(:time_s

我有一个存储事件的模型,每个事件都有一个开始时间

开始时间由rails作为时间处理,但在Postgres中存储为datetime(我假设),rails只是忽略日期并将其存储为2000-01-01

我的问题是,对它进行排序,以便在午夜之后开始的事件在之后而不是之前出现。我怎样才能对它们进行不同的分类,并在24小时内对事件进行分割,以便第一个上午12小时的事件在第二个下午的事件之后出现。(如果是这样的话)

有什么想法吗

c=Event.last
c.event_items.order(:time_start)
哪一个按“事件\项目\”排序。时间\开始ASC

我想从12小时之前(24小时时钟)的日期来后,这些12小时+


在这个例子中,我希望顺序是22:10,23:00,23:50,00:40,01:10,02:00,我想你可以这样做

c = Event.where(:time_start > 12.hours).order(:time_start) << Event.where(:time_start < 12.hours).order(:time_start)

c=Event.where(:time\u start>12.hours)。order(:time\u start)我想你可以这样做

c = Event.where(:time_start > 12.hours).order(:time_start) << Event.where(:time_start < 12.hours).order(:time_start)
c=Event.where(:time\u start>12.hours)。order(:time\u start)postgres中有一个函数,所以我想你可以这样做

Event.order("CAST(date_part('hour', time_start) AS Integer)/12 DESC,
             CAST(date_part('hour', time_start) AS Integer)%12 ASC")
如果你想把你的时间分成不同的模块,那么试着用不同的分频器

更新

我想我需要详细说明一下

基本上,我提取了
时间的小时部分\u start
时间戳并转换(或
转换
)它被设置为整数,因为我想使用整数而不是时间。如果我们简单地将小时除以12,它将给我们一个间隔,请查看上面指向postgres doc的链接以了解更多详细信息

因此,第一个表达式
CAST(date\u part('hour',time\u start)为整数)/12
为0或1;如果小时在12之前,则为0,如果12之后为1。这就是您想要的,将12之后的小时放在12之后的小时之上。它们将从23>12排序,然后从11>0排序,因此不完全是您想要的

因此,第二个
强制转换(日期部分('hour',时间开始)为整数)%12
。这将使用23=>11、22=>10…12=>0和11=>11…0=>0等。因此,我们可以按升序对它们进行排序

顺便说一句,这不会对分钟进行排序,因此您可能需要添加
time\u start ASC
作为第三个排序标准。我认为您还可以将
CAST(date\u part('hour',time\u start)添加为整数)
SELECT
语句并命名,然后只在
ORDER By
上引用该名称

希望有帮助:)

postgres中有一个函数,所以我想你可以这样做

Event.order("CAST(date_part('hour', time_start) AS Integer)/12 DESC,
             CAST(date_part('hour', time_start) AS Integer)%12 ASC")
如果你想把你的时间分成不同的模块,那么试着用不同的分频器

更新

我想我需要详细说明一下

基本上,我提取了
时间的小时部分\u start
时间戳并转换(或
转换
)它被设置为整数,因为我想使用整数而不是时间。如果我们简单地将小时除以12,它将给我们一个间隔,请查看上面指向postgres doc的链接以了解更多详细信息

因此,第一个表达式
CAST(date\u part('hour',time\u start)为整数)/12
为0或1;如果小时在12之前,则为0,如果12之后为1。这就是您想要的,将12之后的小时放在12之后的小时之上。它们将从23>12排序,然后从11>0排序,因此不完全是您想要的

因此,第二个
强制转换(日期部分('hour',时间开始)为整数)%12
。这将使用23=>11、22=>10…12=>0和11=>11…0=>0等。因此,我们可以按升序对它们进行排序

顺便说一句,这不会对分钟进行排序,因此您可能需要添加
time\u start ASC
作为第三个排序标准。我认为您还可以将
CAST(date\u part('hour',time\u start)添加为整数)
SELECT
语句并命名,然后只在
ORDER By
上引用该名称


希望这有帮助:)

那么你想让它们按照当前时间出现的顺序进行排序吗?我不明白,你的问题是什么,对不起!@holden我尽我所能回答,我明白你的意思了吗?那么你想让它们按照当前时间出现的顺序进行排序吗h当前时间?我不明白,你的问题是什么,对不起!@holden我尽我所能回答了,我明白你的意思了吗?>=的时间比较不起作用。“ArgumentError:将符号与ActiveSupport::Duration进行比较失败。”“但我也希望有一种更干净的方式,通过订单条款来实现。”@holden好的,谢谢你的更正,但我希望你了解我的答案。将此更新为正确的语法只需一点努力,所以请这样做,而不要留下这样的注释。>=的时间比较不起作用。“ArgumentError:Symbol与ActiveSupport::Duration的比较失败”,但我也希望有一种更干净的方法,可以使用ORDERBY子句来完成此操作。;-)@holden好的,谢谢你的更正,但我希望你知道我的答案。更新到正确的语法只需要一点努力,所以请这样做,而不是留下这样的评论。最后一个问题,我不知道如何将分钟数作为第三个标准?只需将
时间开始ASC
添加到组合中,这样就可以
转换(日期部分('hour',时间开始)为整数)/12描述,转换(日期部分('hour',时间开始)为整数)%12 ASC,时间开始ASC
最后一个问题,我不知道如何将分钟数作为第三个标准?只需将
时间开始ASC
添加到组合中,这样就可以
转换(日期部分('hour',时间开始)为整数)/12描述,转换(日期部分('hour',时间开始)为整数)%12 ASC,时间开始ASC