SQL查询问题 - 在Master数据库上运行完全正常但在其他数据库

时间:2018-05-31 09:12:16

标签: sql sql-server

我需要确定导致以下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')

1 个答案:

答案 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)