使用Case和DateDiff更新语句

时间:2019-04-26 21:59:48

标签: tsql

我确信此查询的编写正确,但是我继续在期望的列中插入了“ Null”。我的开始日期和结束日期列是日期时间,并且包含日期,所以我不确定为什么不执行datediff计算和更新列。

我在做容易被忽视的错误吗?

DECLARE @X INT

UPDATE MyTable
SET @X = DATEDIFF(s, Start_Date, End_Date)
    ,Column1 = CASE 
        WHEN Start_Date <> NULL
            AND End_Date <> NULL
            THEN (
                    SELECT CONVERT(VARCHAR(10), (@x / 86400)) + ' Days ' + CONVERT(VARCHAR(10), ((@x % 86400) / 3600)) + ' Hours ' + CONVERT(VARCHAR(10), (((@x % 86400) % 3600) / 60)) + ' Minutes '
                    )
        ELSE NULL
        END

样本数据: 开始日期= 2018-08-08 00:00:00.000 结束日期= 2020-08-08 00:00:00.000

(这是我在实际数据库中使用的实际数据)

2 个答案:

答案 0 :(得分:0)

是的。请参阅Not equal <> != operator on NULL

<>是标准SQL-92; !=等效。两者都评估值,而NULL不是-NULL是一个占位符,表示没有值。

这就是为什么您只能使用IS NULL / IS NOT NULL作为此类情况的谓词的原因。

答案 1 :(得分:0)

您必须将select语句放在大写字母里面:

DECLARE @X INT

UPDATE MyTable
SET @X = DATEDIFF(s, Start_Date, End_Date)
    ,Column1 = CASE 
        WHEN Start_Date is not NULL AND End_Date is not NULL
            THEN    CONVERT(VARCHAR(10), (@x / 86400)) + ' Days ' + 
                    CONVERT(VARCHAR(10), ((@x % 86400) / 3600)) + ' Hours ' + 
                    CONVERT(VARCHAR(10), (((@x % 86400) % 3600) / 60)) + ' Minutes '
        ELSE NULL
    END

似乎子查询

(SELECT CONVERT....) 

先于

求值
@X = DATEDIFF(s, Start_Date, End_Date)

因此@X仍为null,子查询的结果为null