我有一张比赛表。该表有一个名为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"
功能?
答案 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')