日期挑战时的SQL案例

时间:2018-03-26 09:20:53

标签: sql-server

所以我试着搜索这个问题。但说实话,我甚至不确定什么会导致我的代码第一次工作,但后来用错误替换结果。我可能缺乏一些基本的东西。如果是这种情况,那么我道歉。

这是我的代码

UPDATE tableA
       SET tableA.X= 
              CASE WHEN tableB.A <= 0 AND tableA.X = '' THEN CONVERT(NVARCHAR(10), CONVERT(DATE, GETDATE(), 103), 103)
                     WHEN TableB.A > 0 THEN '' 
                      ELSE 'Error' 
END
FROM tableB JOIN tableA 
ON tableB.key=tableA.key;

我想做的事情很简单。当我检测到tableB.A为0的情况时,我想将tableA.X更新为今天的日期。但是当tableB.A再次大于0时,我只想用其他东西替换这个日期。

当前正在发生的是当我第一次运行代码时。它用今天的日期替换tableB.A.但是第二天,它会将所有日期替换为错误。

示例结果: TableB.A = 0 TableA.X = 26/03/2017

明天 TableB.A = 0 TableA.X ='错误

为什么会这样?

感谢您的时间。

3 个答案:

答案 0 :(得分:0)

您已使用此条件更新了 tableA.X &#34; tableB.A&lt; = 0 AND tableA.X =&#39;& #39; 到当前日期。

现在 tableA.X 不再是&#39; &#39; (因为它有一个日期),所以它将输入ELSE子句。

答案 1 :(得分:0)

问题是第一个AND上的WHEN条件。在这里,当表B低于或等于0 时,您将放置今天的日期表A的X是空的。

tableB.A <= 0 AND tableA.X = ''

第一次执行后(假设X为空字符串且B为负数),您将使用今天的日期替换X的值。所以明天,对于B的相同表达式和值,条件将为真(因为X不是空的,它具有今天的值)。因为它不是真的和第二个条件

TableB.A > 0

仍然是假的(假设B的值仍为负数或零),那么它将跳转到ELSE(错误)。

解决方案是将X的旧值保留在ELSE

ELSE tableA.X END

或者,如果您想在每次执行时设置今天的值,请删除第一个WHEN上的X空比较。

... WHEN tableB.A <= 0 THEN ...

答案 2 :(得分:0)

尝试使用以下脚本

    UPDATE a
   SET a.X= 
          CASE WHEN isnull(convert(int,b.A ),0)<= 0 AND isnull(a.X,0) = 0 THEN  convert(varchar,getdate(),103)
                 WHEN b.A > 0 THEN '' 
                  ELSE 'Error' END
    FROM b JOIN a 
    ON b.key=a.key