Play框架,PostgreSQL内存数据库,间隔时间不起作用。

3
我无法使用Play框架使以下请求正常工作。
SELECT DISTINCT tableName 
    FROM hand 
    WHERE (hand.userLogin = {userLogin} OR {userLogin} IS NULL)
    AND (date >= now() - interval '3 days')
    ORDER BY tableName

我在PostgreSQL数据库上测试了它,并且它完美地工作了。但是,当我尝试在dev模式下运行时,它无法正常工作,我会得到以下错误:
Caused by: org.h2.jdbc.JdbcSQLException: SQL语句中的语法错误 "SELECT DISTINCT TABLENAME FROM HAND WHERE (HAND.USERLOGIN = ? OR ? IS NULL) AND (DATE >= CURRENT_TIMESTAMP - INTERVAL '3 minute'[*]) ORDER BY TABLENAME "; 期望 "., (, [, ::, *, /, %, +, -, ||, ~, !~, (, NOT, LIKE, REGEXP, IS, IN, BETWEEN, AND, OR, ,, )";
我的配置文件如下:
db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:play;MODE=PostgreSQL"

我不知道我做错了什么。 去掉间隔部分后,它可以工作,显然这是问题的原因。

2个回答

2
Postgres的时间间隔不属于H2标准,因此H2不支持它。请参见h2语法文档获取支持的函数和关键字。

还有没有一种方法可以编写代码,让H2和PostgreSQL都能理解呢?我找不到任何资料。H2的写法如下:SELECT DISTINCT tableName FROM hand WHERE date >= DATESUB('MINUTE', 3, NOW()) ORDER BY tableName - Bentaye
尝试这个 SELECT DISTINCT tableName FROM hang WHERE date >= DATE_SUB(NOW(), INTERVAL 3 MINUTE); - Mon Calamari
H2也不喜欢它: 找不到函数“DATE_SUB”。我想我只需在我的开发环境中安装一个Postgres数据库,这将避免问题。 - Bentaye
我觉得H2非常有限,因此我安装了mysql和UAT。如果你在Play!中使用JPA,请尝试使用JPA API来进行日期函数,而不是纯数据库特定的SQL语句。希望这能解决你的问题。 - Mon Calamari
1
“间隔”(interval)数据类型自 1992 年起就已成为 SQL 标准的一部分。PostgreSQL 自 7.1 版本以来就支持 SQL 间隔。 - Mike Sherrill 'Cat Recall'

0

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

标准SQL和PostgreSQL

标准SQL引用数字,但不引用限定词。在这种情况下,限定词始终是单数形式,而不是复数形式。(如“day”,而不是“days”)。

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()函数返回一个长整数,而不是一个间隔。

该怎么办

如果你的生产数据库管理系统是PostgreSQL,那么你在开发和测试中也应该使用PostgreSQL。


那就是我最终做的 :) 谢谢 - Bentaye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接