gpt4 book ai didi

sql - rails 按时间排序,24 小时倒转

转载 作者:行者123 更新时间:2023-11-29 12:00:26 24 4
gpt4 key购买 nike

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

开始时间由 rails 处理为时间,但在 Postgres 中存储为日期时间(我假设)并且 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

最佳答案

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

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

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

更新

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

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

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

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

顺便说一下,这不会对分钟 进行排序,因此您可能希望添加time_start ASC 作为第三个排序标准。我认为您还可以将 CAST(date_part('hour', time_start) AS Integer) 添加到 SELECT 语句并为其命名,然后仅在 ORDER 上引用该名称通过

希望这有帮助:)

关于sql - rails 按时间排序,24 小时倒转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18443213/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com