开发者社区 问答 正文

为什么HSQL Concat MS SQL不工作吗?

所以我有Hibernate 5.3.1项目连接到不同的引擎(MySql,甲骨文,PostgreSQL和MS SQL),所以我不能使用本机查询。

假设有三个表中的记录,都有相同的datetime,但我需要将它们分组只有通过日期(时间)。例如,2019-12-04;

我执行这个查询:

SELECT CONCAT(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 CONCAT(year(tx.date_), month(tx.date_), day(tx.date_)), iss.code 但是,当我测试它连接到SQL SERVER 2017,而不是回报20191204,这是返回2035。 在甲骨文和MySQL工作正常。

有人知道这是为什么发生? 我尝试过不同的方式,比如使用+而不是CONCAT但结果是一样的。

我也试图提取分离(没有concat),和他们已经回到正确的。 问题是,我需要将它们分组的完成日期。

备案,被声明为datetime2在DDBB

展开
收起
SONGYiiiD 2019-12-05 23:05:24 1707 分享 版权
阿里云 AI 助理回答

看起来你在尝试跨不同数据库引擎(MySQL, Oracle, PostgreSQL, 和 MS SQL Server)使用一个标准化的查询来获取日期部分并进行分组。问题在于,当你在SQL Server 2017上使用CONCAT(year(tx.date_), month(tx.date_), day(tx.date_))时,结果并不如预期(返回了2035而非20191204)。这可能是由于数据类型处理或函数行为的差异导致的。

对于跨数据库兼容性,避免直接使用数据库特定的函数是一个好策略。考虑到这一点,你可以尝试使用标准的SQL函数DATE_FORMAT()或者TO_CHAR(),但请注意这些函数在不同的数据库中可能有不同的名称或不被支持。对于你的情况,一个更通用且可能在所有提到的数据库中都适用的方法是使用数据库的日期转换功能将datetime转换为只含日期的部分,然后进行分组。

针对MS SQL Server,推荐使用CONVERTFORMAT函数来格式化日期为字符串,以便于分组。但是,为了确保跨数据库兼容性,可以考虑将日期转换为整数形式表示日期,比如通过计算自某个固定日期(如1970-01-01)以来的天数。这样做的好处是它可以在大多数数据库系统中工作,尽管实现细节会有所不同。

对于MS SQL Server的解决方案:

你可以尝试使用DATEDIFF函数来计算日期与一个固定日期之间的天数,这应该在所有数据库中都能得到一致的结果:

SELECT DATEDIFF(day, '1970-01-01', CONVERT(date, tx.date_)) AS date_key, 
       iss.code 
FROM tx_ tx 
JOIN issuer_ iss ON tx.id_issuer = iss.id 
GROUP BY DATEDIFF(day, '1970-01-01', CONVERT(date, tx.date_)), iss.code;

这个查询首先将tx.date_转换为只包含日期的部分(CONVERT(date, tx.date_)),然后计算该日期与1970年1月1日之间的天数作为分组键。这种方法在Oracle、PostgreSQL和MySQL中也有相应的函数可以实现类似的功能,虽然具体的函数名和参数可能不同。

跨数据库的一般建议:

  • 了解并利用数据库的日期时间处理函数:每个数据库都有其处理日期和时间的标准函数,尽量选择那些具有广泛兼容性的函数。
  • 避免直接字符串操作:如你的例子所示,直接使用CONCAT可能导致意外结果,尤其是在处理日期和时间时。
  • 考虑使用中间层处理:如果应用允许,可以在应用程序层面(Java、Python等)统一处理日期格式化和分组逻辑,然后再执行数据库查询,这样可以减少数据库间的兼容性问题。
  • 使用ORM工具的抽象层:如果你的项目使用Hibernate这样的ORM框架,探索其提供的跨数据库查询抽象能力,以帮助解决这类问题。

希望这些建议能帮助你解决问题。如果有阿里云产品相关的问题,也欢迎继续提问。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答