3

我有一堆记录,其中DateTime存储了仅用于提取一天中的时间(即下午 6:00)的记录,我想按一天中的时间过滤它们。例如,我想获取一天中时间在上午 10:00 到下午 2:00 之间的所有记录,而不管时间戳是针对哪一天的。

有没有办法在 Rails 中做到这一点?我意识到这DateTime可能不是存储这些数据的最简单/最好的方法,所以我愿意改变它。另外,我正在使用 Postgres。

4

2 回答 2

3

使用 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')
于 2014-04-04T20:51:13.363 回答
1

如果您使用的是作为 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_dateFIRST_DATESECOND_DATE

于 2013-07-21T19:36:16.097 回答