所以我有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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
看起来你在尝试跨不同数据库引擎(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,推荐使用CONVERT
或FORMAT
函数来格式化日期为字符串,以便于分组。但是,为了确保跨数据库兼容性,可以考虑将日期转换为整数形式表示日期,比如通过计算自某个固定日期(如1970-01-01)以来的天数。这样做的好处是它可以在大多数数据库系统中工作,尽管实现细节会有所不同。
你可以尝试使用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
可能导致意外结果,尤其是在处理日期和时间时。希望这些建议能帮助你解决问题。如果有阿里云产品相关的问题,也欢迎继续提问。