我在一个rails应用程序中使用PostgreSQL数据库,面临着一个挑战,那就是只根据users表中timestamp
类型created_at
列的时间组件来提取用户记录。
此查询工作正常:
users = User.where(" DATE_PART('hour', created_at) >= ?
AND DATE_PART('minute', created_at) >= ?
OR DATE_PART('hour', created_at) <= ?
AND DATE_PART('minute', created_at) <= ?",
10, 0, 15, 30).pluck :created_at
字符串
但我很好奇是否有更优雅的方法来提取所需的记录。本质上,我的目标是仅基于时间查询记录,不包括日期。例如,我想检索在10:00
和12:30
之间创建的任何一天的所有用户(年,月和日无关)。
我也试过这个:
User.where("EXTRACT(HOUR FROM created_at) BETWEEN ? AND ?", 14, 15)
型
但它只处理小时而不是分钟。
所需的时间可以是10
-12
小时或10:00
-12:30
。如果我想提取10:00
到12:30
的记录,如何管理这些分钟?
简而言之,我正在寻找一种方法,可以指定所需的时间并获得这些时间段内的所有记录。
1条答案
按热度按时间rn0zuynd1#
PostgreSQL有一个
time
类型,你可以将timestamp
转换为它,以便一次性提取从小时开始的所有内容(不包括秒和秒的分数)。个字符
| 创建于|
| --|
| 2023-12-08 11:55:58.167576|
| 2023-12-09 11:39:04.189425|
| 2023-12-10 12:09:11.234004|
| 2023-12-11 11:40:42.80833|
在RoR中,你可以将time字段传入PostgreSQL
make_time()
。第三个字段是double precision
,它允许你用分数传递秒:型
您也可以传递任何具有匹配时间的时间戳,并强制转换为仅使用其
time
元素:型
可以通过在
created_at
上添加functional index来进一步加快速度:型