【问题标题】:date/time math in HQLHQL 中的日期/时间数学
【发布时间】:2012-06-18 11:39:39
【问题描述】:

这是来自 HQL 中的 WHERE 子句:

(current_timestamp() - c.m_some_time) >= :3000) // finding 3 seconds and older

它不起作用。

我看到了很多关于这个主题的问题,但他们都避免使用 current_timestamp() 而是使用 Java Date() 代替(使用 setString()),这对我来说是错误的,因为我需要精确度 .

我看到的另一种方法是派生方言并注册我自己的函数。这个好像太吹了。

有什么方法可以在纯内置 HQL 中进行简单的时间数学运算并将其与简单的毫秒/秒值进行比较?

另一个我很好奇的问题是为什么上面的 WHERE 子句确实通过了 HQL 的检查?我的意思是,这是一个有效的 HQL 查询的一部分(当其他 WHERE 子句是有效)。

【问题讨论】:

    标签: java hibernate datetime date


    【解决方案1】:

    从以下位置更改查询中的变量顺序:

    current - from_db >= 3000
    

    收件人:

    from_db <= (current - 3000)
    

    您将在查询中计算值:

    calculated_timestamp = current_timestamp() - 3000;
    
    c.m_some_time <= :calculated_timestamp
    

    【讨论】:

    • (c.m_some_time &lt;= current_timestamp() - 3000) 不起作用。
    • current_timestamp() - 3000 应该作为字符串或参数传递给您的查询。
    • 确实如此。以上是我在 HQL 语句中写它的确切方式。似乎没有减去日期。
    • @SteveEbersole 与听起来一模一样。在 WHERE 子句中有(c.m_some_time &lt;= current_timestamp() - 3000),同时知道肯定这个条件应该通过,就是这样。它对你有用吗?有人测试过吗?
    • 与其试图争论,也许你应该尊重那些试图帮助你的人?在数据库中运行时,生成的 SQL 是否返回您期望的结果?您必须了解 Hibernate 只是将其传递给数据库。并且支持日期算术的细节非常多样。根据 ANSI SQL,查询中的 3000 被解释为 INTERVAL 数据类型;但是,没有定义作为原始文字的“精度”。你认为是 3000 毫秒,但对于 Oracle 来说是 3000 天(IIRC);在你的数据库上,不知道。
    【解决方案2】:

    最终似乎没有答案,所以最好是扩展 Dialect 并注册一个函数。

    【讨论】:

      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 2014-10-30
      • 1970-01-01
      • 2012-12-04
      相关资源
      最近更新 更多