如何比较PostgreSQL中date时间字段的date?

比较postgresql中的date(Windows 9.2.4版本)时,我一直面临一个奇怪的情况。 我有一个列在我的表中说update_date与types'timestamp without timezone'。 客户只能在date(即:2013-05-03)或date与时间(即:2013-05-03 12:20:00)search该字段。 此列的值为当前所有行的时间戳,并具有相同的date部分(2013-05-03),但时间部分不同。

当我比较这个专栏时,我得到不同的结果。 如下所示:

select * from table where update_date >= '2013-05-03' AND update_date <= '2013-05-03' -> No results select * from table where update_date >= '2013-05-03' AND update_date < '2013-05-03' -> No results select * from table where update_date >= '2013-05-03' AND update_date <= '2013-05-04' -> results found select * from table where update_date >= '2013-05-03' -> results found 

我的问题是如何使第一个查询可能获得结果,我的意思是为什么第三个查询工作,但不是第一个?

有人可以帮我吗? 提前致谢。

对于任何数据,@Nicolai对于投射是正确的,为什么这个条件是错误的。 我想你更喜欢第一种forms,因为你想避免在inputstring的date操作,正确的? 你不需要害怕:

 SELECT * FROM table WHERE update_date >= '2013-05-03'::date AND update_date < ('2013-05-03'::date + '1 day'::interval); 

当你比较update_date >= '2013-05-03'将值转换为相同的types来比较值。 所以你的'2013-05-03'被铸造成'2013-05-03 00:00:00'。

所以对于update_date ='2013-05-03 14:45:00'你的expression将是:

 '2013-05-03 14:45:00' >= '2013-05-03 00:00:00' AND '2013-05-03 14:45:00' <= '2013-05-03 00:00:00' 

这总是false

为了解决这个问题,将update_date转换为date

 select * from table where update_date::date >= '2013-05-03' AND update_date::date <= '2013-05-03' -> Will return result 

使用rangetypes。 如果用户inputdate:

 select * from table where update_date <@ tsrange('2013-05-03', '2013-05-03'::date + 1, '[)'); 

如果用户input时间戳,则不需要::date + 1部分

http://www.postgresql.org/docs/9.2/static/rangetypes.html

http://www.postgresql.org/docs/9.2/static/functions-range.html