【发布时间】:2020-03-30 10:28:04
【问题描述】:
所以,我在一个连接到不同引擎(MySql、Oracle、PostgreSQL 和 MS SQL)的项目中有 Hibernate 5.3.1,所以我不能使用本机查询。
假设我在一个表中有 3 条记录,它们都具有相同的日期时间,但我需要仅按日期(而不是时间)对它们进行分组。 例如,2019-12-04;
我执行这个查询:
SELECT
CONCAT(year(tx.date_), month(tx.date_), day(tx.date_)),
iss.code,
COUNT(tx.id)
FROM
tx_ tx
JOIN
issuer_ iss
ON
tx.id_issuer = iss.id
GROUP BY
CONCAT(year(tx.date_), month(tx.date_), day(tx.date_)), iss.code
但是,当我测试它连接到 SQL SERVER 2017 时,它不是返回 20191204,而是返回 2035。在 Oracle 和 MySQL 中运行良好。
有人知道为什么会这样吗?我尝试了不同的方法,例如使用 + 而不是 CONCAT 但结果是一样的。
我也尝试将它们单独提取(没有连接),并且它们一直返回正确。问题是,我需要按完整日期对它们进行分组。
为了记录,该字段在 DDBB 中声明为 datetime2
【问题讨论】:
-
2035 = 2019 + 12 + 4。这应该给你一个提示:)。您显示了一个 HSQL 查询,但这不是 Hibernate 为 Sql Server 生成的 SQL 查询。
-
大声笑,这是一个惊人的效果。 Sql Server 和 Sybase 是唯一(?)使用
+进行加法和连接的 RDBMS。也许与此有关? -
难道没有一个 HSQL“函数”可以将时间戳(日期时间)转换为普通的“DATE”吗?
-
我对 HSQL/Hibernate 不熟悉,但是否存在一些影响 SQL 查询生成引擎的提供程序兼容性设置?自 2012 年以来,Sql Server 仅具有
CONCAT语句。也许如果您可以告诉 Hibernate 翻译该最低版本,查询将按预期生成(在 SQL 中使用CONCAT)。 -
我认为它有一个 TRUNC 来削减时间部分。但不确定这是否仅适用于 oracle。
标签: sql-server spring hibernate hsqldb concat