为什么 Hibernate HSQL Concat 不适用于 MSSQL?
Why Hibernate HSQL Concat is not working for MSSQL?
所以,我在连接到不同引擎(MySql、Oracle、PostgreSQL 和 MS SQL)的项目中有 Hibernate 5.3.1,所以我不能使用本机查询。
假设我在 table 中有 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 时,它不是 return 20191204,而是 returning 2035。在 Oracle 中,MySQL 工作正常。
有人知道为什么会这样吗?我尝试了不同的方法,比如使用 + 而不是 CONCAT 但结果是一样的。
我也尝试过将它们单独提取(没有连接),它们 return 是正确的。问题是,我需要按完整日期对它们进行分组。
为了记录,该字段在 DDBB
中声明为 datetime2
如何简单地添加它们,而不是使用 CONCAT
。
(year(tx.date_)*10000 + month(tx.date_)*100 + day(tx.date_)*1) AS datenum
因此,试试这个:
SELECT
CAST((year(tx.date_)*10000 + month(tx.date_)*100 + day(tx.date_)*1) AS string) AS datenum,
iss.code
FROM tx_ tx
JOIN issuer_ iss
ON tx.id_issuer = iss.id
GROUP BY year(tx.date_), month(tx.date_), day(tx.date_), iss.code
感谢Gert Arnold给我的提示。我只是没有意识到查询正在添加,就像它们是 MSSQL 中的数字一样。
最后,我设法让它在 4 RDBMS 中首先转换为字符串
SELECT
CONCAT(CAST(year(tx.date_) AS string), CAST(month(tx.date_) AS string), CAST(day(tx.date_) AS string)),
iss.code
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
我也试过 转换为 TEXT,但它在 MySQL
中抛出异常
为什么要使用 concat()
开头?
假设 Hibernate 负责转换非标准 year()
、month()
和 day()
函数,那么以下内容应该适用于任何 DBMS
SELECT year(tx.date_), month(tx.date_), day(tx.date_), iss.code
FROM tx_ tx
JOIN issuer_ iss ON tx.id_issuer = iss.id
GROUP BY year(tx.date_), month(tx.date_), day(tx.date_), iss.code
所以,我在连接到不同引擎(MySql、Oracle、PostgreSQL 和 MS SQL)的项目中有 Hibernate 5.3.1,所以我不能使用本机查询。
假设我在 table 中有 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 时,它不是 return 20191204,而是 returning 2035。在 Oracle 中,MySQL 工作正常。
有人知道为什么会这样吗?我尝试了不同的方法,比如使用 + 而不是 CONCAT 但结果是一样的。
我也尝试过将它们单独提取(没有连接),它们 return 是正确的。问题是,我需要按完整日期对它们进行分组。
为了记录,该字段在 DDBB
中声明为 datetime2如何简单地添加它们,而不是使用 CONCAT
。
(year(tx.date_)*10000 + month(tx.date_)*100 + day(tx.date_)*1) AS datenum
因此,试试这个:
SELECT
CAST((year(tx.date_)*10000 + month(tx.date_)*100 + day(tx.date_)*1) AS string) AS datenum,
iss.code
FROM tx_ tx
JOIN issuer_ iss
ON tx.id_issuer = iss.id
GROUP BY year(tx.date_), month(tx.date_), day(tx.date_), iss.code
感谢Gert Arnold给我的提示。我只是没有意识到查询正在添加,就像它们是 MSSQL 中的数字一样。
最后,我设法让它在 4 RDBMS 中首先转换为字符串
SELECT
CONCAT(CAST(year(tx.date_) AS string), CAST(month(tx.date_) AS string), CAST(day(tx.date_) AS string)),
iss.code
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
我也试过 转换为 TEXT,但它在 MySQL
中抛出异常为什么要使用 concat()
开头?
假设 Hibernate 负责转换非标准 year()
、month()
和 day()
函数,那么以下内容应该适用于任何 DBMS
SELECT year(tx.date_), month(tx.date_), day(tx.date_), iss.code
FROM tx_ tx
JOIN issuer_ iss ON tx.id_issuer = iss.id
GROUP BY year(tx.date_), month(tx.date_), day(tx.date_), iss.code