JPQL& Postgresql - 如何在时间戳字段上执行算术以与CURRENT_TIMESTAMP进行比较?

时间:2016-02-22 22:52:36

标签: sql oracle postgresql jpa jpql

我有一张桌子"用户"在两个环境中。一个是使用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环境中做类似的事情?

1 个答案:

答案 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