SQL Server与AWS Aurora Babelfish同查询结果差异排查求助
SQL Server与AWS Aurora Babelfish计算当年剩余天数结果不一致问题
问题背景
迁移至AWS Aurora(Babelfish)时,执行计算当年剩余天数的查询,结果与原SQL Server实例不一致。需要调整查询语句,让Babelfish返回与SQL Server中ExistingSQLFuncResult一致的结果。
SQL Server实例执行详情
查询语句
select getdate() [Today], (datediff(day, getdate(), dateadd(year, datediff(year, 0, getdate()) + 1, 0)) - 1) [ExistingSQLFuncResult], (datediff(day, getdate(),cast(convert(char(4), year(getdate())+1, 112) + '0101' as datetime))-1) [AuroraBablefishResult]
执行结果
| Today | ExistingSQLFuncResult | AuroraBablefishResult |
|---|---|---|
| 2023-03-21 02:00:33.783 | 285 | 285 |
AWS Aurora(Babelfish)实例执行详情
查询语句
select getdate() [Today], (datediff(day, getdate(),cast(convert(char(4), year(getdate())+1, 112) + '0101' as datetime))-1) [AuroraBablefishResult]
执行结果
| Today | AuroraBablefishResult |
|---|---|
| 2023-03-21 02:00:33.783 | 284 |
解决方案
在Babelfish中直接沿用SQL Server的ExistingSQLFuncResult逻辑即可得到一致结果,无需使用字符串拼接转换日期的方式。执行以下语句:
select getdate() [Today], (datediff(day, getdate(), dateadd(year, datediff(year, 0, getdate()) + 1, 0)) - 1) [MatchingResult]
逻辑说明
datediff(year, 0, getdate()) + 1:计算当前年份加1,得到下一年的年份值dateadd(year, ..., 0):基于基准日期0(即1900-01-01),添加对应年份数,生成下一年1月1日00:00:00.000的时间点datediff(day, getdate(), 下一年元旦) - 1:计算当前日期到下一年元旦的天数差,减1后得到当年剩余的天数
此写法依赖的datediff和dateadd函数均为Babelfish支持的兼容函数,能保证与SQL Server的计算逻辑完全一致。
内容的提问来源于stack exchange,提问作者swapna s
相关产品推荐
相关产品推荐

