我在两个环境中有一个表"User“。一种是使用Oracle DB,另一种是Postgresql。我想要做的是检索在过去4小时内创建的所有记录。"User“表有一个"beCreatime”字段,该字段存储记录创建时的时间戳。
我已经在基于Oracle的环境中成功地实现了这一点,使用如下方法:
SELECT u.id, u.userName, u.beCreatime FROM User u WHERE u.beCreatime + 4/24 > CURRENT_DATE但是,在Postgres环境上使用相同的查询时,我会收到以下错误:
Internal Exception: org.postgresql.util.PSQLException: ERROR: operator does not exist: timestamp without time zone + integer
Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Position: 100
Error Code: 0
Call: SELECT Id AS a1, UserName AS a2, be_creatime AS a3 FROM BeamUser WHERE ((be_creatime + (? / ?)) > CURRENT_TIMESTAMP) LIMIT ? OFFSET ? bind => [4 parameters bound] Query: ReportQuery(referenceClass=UserEntity sql="SELECT Id AS a1, UserName AS a2, be_creatime AS a3 FROM BeamUser WHERE ((be_creatime + (? / ?))
CURRENT_TIMESTAMP) LIMIT ? OFFSET ?")看来Postgres只是不喜欢增加时间戳(u.beCreatime)和4/24。在Postgres环境中有类似于此的方法吗?
发布于 2016-02-22 23:00:41
您需要使用一个间隔:
WHERE u.beCreatime + interval '4' hour > CURRENT_DATE但是不能将'4'作为参数传递,您需要在PreparedStatement中执行如下操作:
WHERE u.beCreatime + (interval '1' hour) * ? > CURRENT_DATE您确定要将该值与current_date进行比较吗?因为current_date确实而不是在Postgres中包含任何时间信息(就像在DATE中一样,因为缺少“真实”的DATE数据类型)
如果要获得Oracle的行为,就必须使用current_timestamp,因为与Oracle不同,Postgres中的DATE不包含时间部分(包括current_date)
https://stackoverflow.com/questions/35565542
复制相似问题