如何将一整天与日期时间字段匹配?

时间:2012-01-12 09:54:13

标签: ruby-on-rails-3 postgresql datetime select timestamp

我有一张比赛表。该表有一个名为matchdate的列,它是一个datetime字段。

如果我在2011-12-01有3场比赛:

  
      
  • 2011-12-01 12:00:00
  •   
  • 2011-12-01 13:25:00
  •   
  • 2011-12-01 16:00:00
  •   

我如何查询?如何在1个单一日期查询所有比赛?

我查看了date_trunc()to_char()等。
是不是有一些"select * where datetime in date"功能?

3 个答案:

答案 0 :(得分:5)

如果您想要简单的语法,请将timestamp值转换为date。像这样:

SELECT *
FROM   tbl
WHERE  timestamp_col::date = '2011-12-01';  -- date literal

但是,使用大表格会更快:

SELECT *
FROM   tbl
WHERE  timestamp_col >= '2011-12-01 0:0'    -- timestamp literal
AND    timestamp_col <  '2011-12-02 0:0';

原因:第二个查询不必转换表中的每个值,并且可以在timestamp列上使用简单索引。表达式为sargable

注意排除上限(<而不是<=)以获得正确的选择 你可以通过这样创建index on an expression来弥补这一点:

CREATE INDEX tbl_ts_date_idx ON tbl (cast(timestamp_col AS date));

然后查询的第一个版本将尽可能快。

答案 1 :(得分:1)

不确定我是否遗漏了明显的东西,但我认为你可以

select * from table where date_trunc('day', ts) = '2011-12-01';

答案 2 :(得分:0)

只需使用SQL BETWEEN函数:

SELECT * FROM table WHERE date BETWEEN '2011-12-01' AND '2011-12-02'

您可能需要在日期文字中包含时间,但这应包括情人限制并排除上限。

从轨道上我相信你可以做到:

.where(:between => '2011-12-01'..'2011-12-02')