2011-05-03 70 views

回答

40

我想你想投你dtdate和修复the format of your date literal

SELECT * 
FROM table 
WHERE dt::date = '2011-01-01' -- This should be ISO-8601 format, YYYY-MM-DD 

还是standard version

SELECT * 
FROM table 
WHERE CAST(dt AS DATE) = '2011-01-01' -- This should be ISO-8601 format, YYYY-MM-DD 

extract function不明白 “日期”,它返回一个数。

+6

另外还有一点:如果时间戳字段已建立索引,则使用dt :: date或CAST(dt AS date)可防止使用索引。另一种方法是在dt :: date上构建一个函数索引或者以这种方式编写函数索引(使用参数$ 1作为日期字符串):WHERE dt> = $ 1 AND dt <$ 1 + interval'1 day'。 – 2011-05-05 16:44:57

1

使用PostgreSQL有许多日期/时间函数可用,请参阅here

在您的例子,你可以使用:

SELECT * FROM myTable WHERE date_trunc('day', dt) = 'YYYY-MM-DD'; 

如果你经常运行此查询,就可以使用date_trunc功能以及创建索引:

CREATE INDEX date_trunc_dt_idx ON myTable (date_trunc('day', dt)); 

一个优点如果需要,还有一些更灵活的时区,例如:

CREATE INDEX date_trunc_dt_idx ON myTable (date_trunc('day', dt at time zone 'Australia/Sydney')); 
SELECT * FROM myTable WHERE date_trunc('day', dt at time zone 'Australia/Sydney') = 'YYYY-MM-DD';