我有一张桌子"用户"在两个环境中。一个是使用Oracle DB和另一个Postgresql。我想要做的是检索过去4小时内创建的所有记录。 "用户" table有一个字段" 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环境中做类似的事情?
答案 0 :(得分:0)
您需要使用间隔:
WHERE u.beCreatime + interval '4' hour > CURRENT_DATE
但你不能将'4'
作为参数传递,你需要在PreparedStatement中做这样的事情:
WHERE u.beCreatime + (interval '1' hour) * ? > CURRENT_DATE
您确定是否要将该值与current_date
进行比较? Becaues current_date
不包含Postgres中的任何时间信息(因为缺少"真正的" DATE
数据类型) / p>
如果您想获得Oracle行为,则必须使用current_timestamp
,因为与Oracle不同,Postgres中的DATE
不包含时间部分(包括current_date
)