我有一堆记录,其中DateTime
存储了仅用于提取一天中的时间(即下午 6:00)的记录,我想按一天中的时间过滤它们。例如,我想获取一天中时间在上午 10:00 到下午 2:00 之间的所有记录,而不管时间戳是针对哪一天的。
有没有办法在 Rails 中做到这一点?我意识到这DateTime
可能不是存储这些数据的最简单/最好的方法,所以我愿意改变它。另外,我正在使用 Postgres。
我有一堆记录,其中DateTime
存储了仅用于提取一天中的时间(即下午 6:00)的记录,我想按一天中的时间过滤它们。例如,我想获取一天中时间在上午 10:00 到下午 2:00 之间的所有记录,而不管时间戳是针对哪一天的。
有没有办法在 Rails 中做到这一点?我意识到这DateTime
可能不是存储这些数据的最简单/最好的方法,所以我愿意改变它。另外,我正在使用 Postgres。
使用 Postgres,您可以使用类型转换将日期时间/时间戳字段转换为时间,例如:
select * from posts where created_at::time BETWEEN '10:00:00' and '14:00:00';
因此,在 Rails 中,您应该能够:
Post.where('start_at::time BETWEEN ? AND ?', '10:00:00', '14:00:00')
Postgres 也很聪明,可以理解 AM/PM 格式:
Post.where('start_at::time BETWEEN ? AND ?', '10:00:00 AM', '02:00:00 PM')
如果您使用的是作为 Rails 模型生成器的一部分生成的标准时间戳,那么您将使用DateTime
这些时间戳。
假设这是created_at
模型属性(不一定是,将其更改为您正在使用的值),以下是如何执行此操作:
在原始 SQL 中,您要查找的查询SELECT * FROM TABLE WHERE created_at BETWEEN FIRST_DATE AND SECOND_DATE;
可以在 Rails 中表示为:
@first_date = DateTime.new(now.year, now.month, now.day, 10, 0, 0, 0)
@second_date = DateTime.new(now.year, now.month, now.day, 14, 0, 0, 0)
Model.where(created_at: @first_date..@second_date)
(它是一个序列运算符)告诉 Rails 使用and作为原始 SQL 查询中的and值..
来构建 BETWEEN查询。@first_date
@second_date
FIRST_DATE
SECOND_DATE