2

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

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

我遇到的问题是订购它,以便在午夜之后开始的事件之后而不是之前出现。我如何对它们进行不同的排序并在 24 小时内拆分事件,以便在晚上事件的后半部分出现第一个上午 12 小时的事件。(如果那样的话)

有任何想法吗?

c=Event.last
c.event_items.order(:time_start)

哪个 ORDER BY \"event_items\".time_start ASC"

+-----+----------+-----------+-------------------------+---------+-------------------------+-------------------------+
| id  | event_id | artist_id | time_start              | area_id | created_at              | updated_at              |
+-----+----------+-----------+-------------------------+---------+-------------------------+-------------------------+
| 155 | 63       | 111       | 2000-01-01 00:40:00 UTC |         | 2013-08-24 21:21:57 UTC | 2013-08-26 00:07:44 UTC |
| 153 | 63       | 133       | 2000-01-01 01:10:00 UTC |         | 2013-08-24 21:21:57 UTC | 2013-08-26 00:07:44 UTC |
| 152 | 63       | 128       | 2000-01-01 02:00:00 UTC |         | 2013-08-24 21:21:57 UTC | 2013-08-26 00:07:44 UTC |
| 151 | 63       | 148       | 2000-01-01 22:10:00 UTC |         | 2013-08-24 21:21:57 UTC | 2013-08-26 00:07:44 UTC |
| 194 | 63       | 124       | 2000-01-01 23:00:00 UTC |         | 2013-08-26 00:07:44 UTC | 2013-08-26 00:07:44 UTC |
| 154 | 63       | 98        | 2000-01-01 23:50:00 UTC |         | 2013-08-24 21:21:57 UTC | 2013-08-26 00:07:44 UTC |
+-----+----------+-----------+-------------------------+---------+-------------------------+-------------------------+

我希望从 12 小时(24 小时时钟)之前开始的日期在 12 小时 + 之后......

例如,在本例中,我希望订单为 22:10、23:00、23:50、00:40、01:10、02:00

4

2 回答 2

3

postgres 中有一个date_part函数,所以我认为你可以做这样的事情

Event.order("CAST(date_part('hour', time_start) AS Integer)/12 DESC,
             CAST(date_part('hour', time_start) AS Integer)%12 ASC")

如果您想将时间分配在不同的模块中,请尝试使用不同的分隔符。

更新

我想我需要详细说明一下。

基本上我提取时间戳的小时部分并将其转换(或)为整数,因为我想使用整数而不是time。如果我们简单地将小时除以 12,它将给我们一个间隔,请查看上面的 postgres 文档链接以获取更多详细信息。time_start cast

所以第一个表达式CAST(date_part('hour', time_start) AS Integer)/12给我们01;如果小时12之前,则为0 ,对于12之后的小时,则为1。这可以满足您的要求,将 hours after 12放在 hours after 12之上。它们将从 23 > 12 排序,然后是 11 > 0,所以不完全是你想要的。

因此第二个CAST(date_part('hour', time_start) AS Integer)%12。这将使用23 => 1122 => 10 ... 12 => 011 => 11 ... 0 => 0等。所以我们可以按升序对它们进行排序。

顺便说一句,这不会对分钟进行排序,因此您可能需要添加time_start ASC第三个排序条件。我认为您也可以添加CAST(date_part('hour', time_start) AS Integer)SELECT语句并为其命名,然后仅在ORDER BY.

希望这有帮助:)

于 2013-08-26T14:26:21.380 回答
1

我想你可以那样做

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

这将一个接一个地连接两个结果,并为您提供所需的结果。

于 2013-08-26T11:55:14.953 回答