我确信此查询的编写正确,但是我继续在期望的列中插入了“ 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
(这是我在实际数据库中使用的实际数据)
答案 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
。