我无法获得以下使用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"
我不知道自己错了什么。 删除间隔部分使其工作,因此显然是问题。
答案 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。