【问题标题】:How to define a date interval in a compatible way?如何以兼容的方式定义日期间隔?
【发布时间】:2011-09-02 10:27:36
【问题描述】:

我正在尝试构建 SQL 查询,应该按原样执行 在 HSQL (v2.2.4) 和 MySQL (v5.1.36) 服务器上都可以(如果它也可以在 DB2 v9 上运行,那就太好了!)

查询是:

select count(*) from document where current_date - cast(indexing_date as date) <= ?

(这里current_date是一个标准的HSQL/MySQL函数,indexing_date是一个类型为datetime的列,参数?被替换为整数20是天数)。

问题是 MySQL 返回日期之间的差异 as between numbers 而 HSQL 返回天的差异(当您从日期中减去日期时这是合乎逻辑的)。

HSQL 也支持这种语法(但 MySQL 不支持):

select count(*) from document where cast(indexing_date as date) between current_date - 20 day and current_date

而 MySQL 没有。我知道 MySQL 中的 DATEDIFF(),但正如我所说,该解决方案应该是可互操作的。

【问题讨论】:

  • MySQL 还支持:current_date - INTERVAL 20 day
  • 我觉得不可能,hsqldb的语法和mysql差太多了。
  • @ypercube:不适用于 HSQLDB:Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: INTERVAL
  • @ajreal:也许 HSQL 与 SQL'92 更兼容? MySQL 支持许多不错的扩展,但它们是非标准的。
  • 是的。我对hsqldb没有经验,但我只是看了一下datediff函数,与MySQL datediff有很大不同。您极不可能为这两个数据库构建通用 SQL。我认为如果你能够为每个数据库拆分成两种 SQL 格式会更省事。

标签: mysql sql db2 hsqldb


【解决方案1】:

HSQLDB 也支持这个:

select count(*) from document where current_date - cast(indexing_date as date) <= cast(? as interval day)

select count(*) from document where cast(indexing_date as date) between current_date - '20' day and current_date

select count(*) from document where indexing_date >= current_date - interval '20' day

此外,从 2.2.6 版本开始,HSQLDB 支持 DATEDIFF(datevaluea, datevalueb),它返回两个日期之间的天数,以及 DAYS(datevalue),它返回自纪元以来的天数。

【讨论】:

  • 非常感谢您的 cmets 并回复HSQL forum。绝对 +1,但 MySQL 拒绝语法 cast(? as interval day)。看来我真的需要检查代码中的数据库...
  • MySQL forum 上的结论是,只有一种方法可以编写此查询。
  • 好的。我们可能会添加对 INTERVAL 的支持? DAY 虽然这不是 ANSI SQL。与 DATEDIFF(date, date)、DATE 和 DAYS 函数相同
  • 您能否提供一个指向 SQL 规范的链接,用作语法语法的基础?我很想为 MySQL 打开一个错误,但我需要一个参考(例如,什么是“正确”语法)。提前致谢。
  • 我已经仔细检查了第三个查询:我有异常 unexpected token: '20' near line 1, column NNN 用于 HSQLDB 2.2.4。希望 2.2.6 尽快推送到 Maven。
【解决方案2】:

db2:

SELECT COUNT(*) 
FROM document 
WHERE DATE(indexing_date) BETWEEN DATE(DAYS(CURRENT DATE) - 20) AND CURRENT DATE

【讨论】:

  • 感谢 cmets,但您的查询是否与 MySQL 或 HSQL 兼容?如果没有,您能推荐一个兼容的吗?
  • 对不起,我不知道其他两个 DBM,这只是建议在您的 DBM 上尝试一下
猜你喜欢
  • 2021-03-19
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
相关资源
最近更新 更多