查询忽略时间戳日期的时间范围

时间:2013-10-14 19:55:57

标签: sql ruby-on-rails ruby postgresql rails-activerecord

我正在尝试查询我的rails数据库中的购买表(Postgres),我想查询时间范围。

例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。

此表格中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。

我试过了:

Purchases.where("created_at BETWEEN ? and ?", Time.now - 1.hour, Time.now)

但这最终只会在那些时候搜索今天的日期。

2 个答案:

答案 0 :(得分:6)

您需要使用PostgreSQL's date_part/extract function从created_at中提取小时部分。

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 20

例如,像这样:

Purchases.where(["EXTRACT(HOUR FROM created_at) BETWEEN ? AND ?", 13, 14])

答案 1 :(得分:3)

使用简单的强制转换为time

Purchases.where("created_at::time >= ?
             AND created_at::time <  ?", Time.now - 1.hour, Time.now)

通过这种方式,您可以轻松地对任意时间进行测试。

考虑:

  • 要包含/排除哪个边框。通常的做法是包含下边框,排除上边框。 BETWEEN 包括两者......

  • 确切的数据类型(timestamptimestamp with time zone)以及与当地时区的互动方式:
    Ignoring timezones altogether in Rails and PostgreSQL

索引

如果您经常运行这些查询并快速需要它们,而且您的表格不是很小,那么您需要为性能创建functional index

CREATE INDEX tbl_created_at_time_idx ON tbl (cast(created_at AS time));

注意:

CREATE INDEX tbl_created_at_time_idx2
ON tbl(cast(created_at AT TIME ZONE 'UTC' AS time));

处理忽略年份的日期的类似问题:
How do you do date math that ignores the year?