sql - 带有 postgresql 的 Rails : extract field from time is not working

标签 sql ruby-on-rails ruby postgresql activesupport

我在按小时订购系列时遇到问题。但重要的是第一。

项目详情:

Rails version             5.1.3
Ruby version              2.4.1-p111 (x86_64-linux)
Database adapter          postgresql

这是我的收藏的样子:

 #<DeliveryTimeslot:0x00562dd1ad2690
  id: 1,
  start: Sun, 02 Jan 2000 01:00:00 +03 +03:00,
  stop: Sun, 02 Jan 2000 02:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:39 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:25 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1abcf98
  id: 2,
  start: Sun, 02 Jan 2000 02:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 03:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:39 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:25 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1ad23c0
  id: 3,
  start: Sat, 01 Jan 2000 03:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 04:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:39 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1ad1e70
  id: 4,
  start: Sat, 01 Jan 2000 04:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 05:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1ad1470
  id: 5,
  start: Sat, 01 Jan 2000 05:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 06:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1ad0bd8
  id: 6,
  start: Sat, 01 Jan 2000 06:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 07:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1acfdc8
id: 7,
  start: Sat, 01 Jan 2000 07:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 08:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1acf7b0
  id: 8,
  start: Sat, 01 Jan 2000 08:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 09:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1acf198
  id: 9,
  start: Sat, 01 Jan 2000 09:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 10:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1acee00
  id: 10,
  start: Sat, 01 Jan 2000 10:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 11:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1aceb80
  id: 11,
  start: Sat, 01 Jan 2000 11:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 12:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1ace838
  id: 12,
  start: Sat, 01 Jan 2000 12:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 13:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1ace4c8
  id: 13,
start: Sat, 01 Jan 2000 13:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 14:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1acdde8
  id: 14,
  start: Sat, 01 Jan 2000 14:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 15:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1acd758
  id: 15,
  start: Sat, 01 Jan 2000 15:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 16:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1acd168
  id: 16,
  start: Sat, 01 Jan 2000 16:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 17:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:26 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1acce20
  id: 17,
  start: Sat, 01 Jan 2000 17:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 18:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:27 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1acc678
  id: 18,
  start: Sat, 01 Jan 2000 18:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 19:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:27 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1abfb30
  id: 19,
  start: Sat, 01 Jan 2000 19:00:00 +03 +03:00,
stop: Sat, 01 Jan 2000 20:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:27 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1abf220
  id: 20,
  start: Sat, 01 Jan 2000 20:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 21:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:27 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1abea78
  id: 21,
  start: Sat, 01 Jan 2000 21:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 22:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:27 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1abe500
  id: 22,
  start: Sat, 01 Jan 2000 22:00:00 +03 +03:00,
  stop: Sat, 01 Jan 2000 23:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:27 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1abdf10
  id: 23,
  start: Sat, 01 Jan 2000 23:00:00 +03 +03:00,
  stop: Sun, 02 Jan 2000 00:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:27 +03 +03:00>,
 #<DeliveryTimeslot:0x00562dd1abd3f8
  id: 24,
  start: Sun, 02 Jan 2000 00:00:00 +03 +03:00,
  stop: Sun, 02 Jan 2000 01:00:00 +03 +03:00,
  created_at: Wed, 05 Oct 2016 17:57:40 +03 +03:00,
  updated_at: Thu, 16 Mar 2017 12:40:27 +03 +03:00>]

startstop 列在架构中都是 t.time(因此记录是 ActiveSupport::TimeWithZone)。

我想做的是按小时对它们进行排序,我必须使用 SQL 语句来完成。

所以我试过这个:

DeliveryTimeslot.all.order("EXTRACT (HOUR FROM start) DESC").map(&:id)

我希望得到这样的数组:

[23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 24]

但是我得到了这个:

[2, 1, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3]

我的想法是,这是因为三个记录(ID 为 1、2 和 24)的开始日期不同(1 月 2 日,而其余记录为 1 月 1 日)。我上面写的查询不是应该从时间类型记录中提取小时吗?真的是因为约会吗? IDK 为什么这不起作用,基本上我无法更改数据库中的任何内容。任何提示我做错了什么?在不更改数据库的情况下是否有任何提示?

最佳答案

找到解决方案。它适用于我现有的应用程序

尝试一下

DeliveryTimeslot.all.order('开始 DESC').sort_by {|item| item.start.to_date}.map{|item| item.id}

关于sql - 带有 postgresql 的 Rails : extract field from time is not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50703950/

相关文章:

sql - 你如何将多个组压缩成一个?

sql - Perl DBI 常量 - 如何访问?

Python SQLite3 SQL注入(inject)漏洞代码

javascript - 尝试在rails中添加button_tag会导致意外的tIDENTIFIER语法错误

mysql - 聚合具有可能空值的列

ruby-on-rails - 正则表达式作为表格条目

ruby-on-rails - Rails : Deploying to Heroku, 很多问题

ruby-on-rails - Rails 关联记录计数内部 View

ruby-on-rails - 这种计算是放​​在Model还是Controller?

ruby-on-rails - 铁路上的 ruby 。我想显示所有待办事项列表及其关联的待办事项项目。我怎样才能做到这一点?