我需要确定导致以下SQL查询失败的问题,错误“向'datetime'列添加值导致行 [DATEADD(d, 1, T1.TERM_DT)]
上的溢出(表包含许多内容)具有术语日期'12 / 31/9999'且日期时间数据类型范围的记录来自'1000-01-01'和'12 / 31/9999')。
当我在master数据库上运行它时,下面的查询运行完全正常。在同一服务器上的其他数据库上运行时,查询仅在出现溢出错误时失败。
在其他数据库上,SQL不考虑条件 [TERM_DT<转换(datetime,'/ 12/99 / 9999')] 导致它溢出。看起来像其他数据库上的一些设置问题,但如果有人确定需要修复的内容,请告诉我。感谢关于这个问题的任何意见
SELECT T1.PFX,
T1.ID,
DATEADD(d, 1, T1.TERM_DT),
DATEADD(d, -1, T2.EFF_DT),
FROM ( SELECT ROW_NUMBER() OVER ( PARTITION BY PFX,ID
ORDER BY EFF_DT)AS 'ROWNUM',
PFX,
ID,
EFF_DT,
TERM_DT,
FROM [Database].dbo.Table1
WHERE DATEDIFF(dd, EFF_DT, TERM_DT) NOT IN (0,1)
) AS T1
FULL OUTER JOIN (SELECT ROW_NUMBER() OVER ( PARTITION BY PFX,ID
ORDER BY EFF_DT)AS 'ROWNUM',
PFX,
ID,
EFF_DT,
TERM_DT,
ID
FROM [Database].dbo.Table1
WHERE DATEDIFF(dd, EFF_DT, TERM_DT) NOT IN (0,1)
) AS T2
ON T1.PFX = T2.PFX
AND T1.ID = T2.ID
AND T1.ROWNUM + 1 = T2.ROWNUM
WHERE DATEADD(d, 1, T1.TERM_DT) <> T2.EFF_DT and T1.TERM_DT < convert(datetime,'12/31/9999')
答案 0 :(得分:0)
您可以使用case
:
WHERE (CASE WHEN T1.TERM_DT < '9999-12-31'
THEN DATEADD(day, 1, T1.TERM_DT)
END) <> T2.EFF_DT
控制执行顺序是在CASE
子句中使用WHERE
表达式的唯一“好”原因(我可以很容易想到)。
或者,您可以将逻辑更改为:
WHERE T1.TERM_DT = DATEADD(day, -1, T2.EFF_DT)