【问题标题】:Play framework, PostgreSQL in memory database, interval not working播放框架,内存数据库中的PostgreSQL,间隔不工作
【发布时间】:2014-12-09 12:35:24
【问题描述】:

我无法收到以下请求以使用 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 '3 分钟'[ *]) 按表名排序";预期 "., (, [, ::, *, /, %, +, -, ||, ~, !~, (, NOT, LIKE, REGEXP, IS, IN, BETWEEN, AND, OR, ,, ) ";

我的 conf 文件说:

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

我不知道我做错了什么。 删除间隔部分使其工作,所以这显然是问题。

【问题讨论】:

    标签: postgresql playframework h2


    【解决方案1】:

    Postgres 区间不属于 H2 标准,因此不受 H2 支持。支持的函数和关键字请参见h2 grammar doc

    【讨论】:

    • 有没有办法写这个让 H2 和 PostgreSQL 理解它?我找不到任何东西。 H2 方式如下所示: SELECT DISTINCT tableName FROM hand WHERE date >= DATESUB('MINUTE', 3, NOW()) ORDER BY tableName
    • 试试这个SELECT DISTINCT tableName FROM hang WHERE date >= DATE_SUB(NOW(), INTERVAL 3 MINUTE);
    • H2 也不喜欢它:未找到函数“DATE_SUB”。我想我会在我的开发环境中安装一个 postgres 数据库,这样可以避免问题。
    • 我发现 H2 真的很有限,因此我有 dev mysql 安装以及 UAT。如果您将 JPA 与 Play! 一起使用,请尝试将 JPA API 用于日期函数,而不是纯数据库特定的 SQL。希望它能解决您的问题。
    • 至少从 1992 年开始,“interval”数据类型就成为 SQL 标准的一部分。PostgreSQL 至少从 7.1 版开始就支持 SQL 间隔。
    【解决方案2】:

    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() function returns a long integer,不是间隔。

    做什么

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

    【讨论】:

    • 这就是我最终做的 :) 谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多