在内存数据库中播放框架,PostgreSQL,间隔不起作用

时间:2014-10-14 16:17:40

标签: postgresql playframework h2

我无法获得以下使用Play框架的请求

SELECT DISTINCT tableName 
    FROM hand 
    WHERE (hand.userLogin = {userLogin} OR {userLogin} IS NULL)
    AND (date >= now() - interval '3 days')
    ORDER BY tableName

我在PostreSQL数据库上测试它并且它工作得很好,但是当我尝试在开发模式下运行它不起作用时,我收到以下错误:

  

引起:org.h2.jdbc.JdbcSQLException:SQL语句中的语法错误" SELECT DISTINCT TABLENAME FROM HAND WHERE(HAND.USERLOGIN =?OR?IS NULL)AND(DATE> = CURRENT_TIMESTAMP - INTERVAL& #39; 3分钟[*])按TABLENAME排序&#34 ;;期待"。,(,[,::,*,/,%,+, - ,||,〜,!〜,(,NOT,LIKE,REGEXP,IS,IN,BETWEEN,AND,OR, ,,)&#34 ;;

我的conf文件说:

db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:play;MODE=PostgreSQL"

我不知道自己错了什么。 删除间隔部分使其工作,因此显然是问题。

2 个答案:

答案 0 :(得分:2)

Postgres间隔不属于H2标准,因此H2不支持。有关支持的功能和关键字,请参阅h2 grammar doc

答案 1 :(得分:0)

H2不支持间隔数据类型,但PostgreSQL支持。

标准SQL和PostgreSQL

标准SQL引用数字,但不引用限定符。在这种情况下,限定符总是单数,而不是复数。 (如 day ,而不是。)

select current_date - interval '3' day;

PostgreSQL允许其变体,包括interval '3 day'interval '3 days'。但它不允许出现在您的错误消息中的这些尾随括号。 (我猜这些括号可能只是错误信息的一部分。)

INTERVAL '3 minute'[*]

您可能还会收到与使用保留字作为列名相关的虚假错误消息。 (单词 date 是保留字。)

您可以在Mimer SQL Validation Services网站上测试标准语法。

<强> H2

H2不支持间隔数据类型。 (Interval isn't in this list。)datediff() function returns a long integer,而不是间隔。

怎么做

如果你的生产dbms是PostgreSQL,你也应该在开发和测试中使用PostgreSQL。