如何比较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
使用range
types。 如果用户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