【问题标题】:Update Statement with Case and DateDiff使用 Case 和 DateDiff 更新语句
【发布时间】:2019-04-27 06:53:59
【问题描述】:

我确信这个查询是正确编写的,但我继续将“Null”插入到预期的列中。我的开始和结束日期列是 datetime 并包含日期,所以我不确定为什么这不执行 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

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

【问题讨论】:

  • 使用is not null 而不是&lt;&gt; null
  • 我应该补充一点,我已经尝试过这个,结果相同。我只是将 换成 IS NOT,但我仍然没有看到计算适用。
  • 如果您发布示例数据会更好。
  • 这有帮助吗?在代码下添加。这是我正在使用的字面两个日期来使此查询起作用。这两列都包含该数据。很明显,它们不是空列。所以,这就是为什么我想知道为什么没有发生计算。

标签: tsql


【解决方案1】:

您必须将 select 语句放在 case 中:

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

【讨论】:

  • 非常感谢您抽出宝贵时间来解释这一点。这是根本原因。现在一切都运行良好。你有关于为什么首先处理子查询的任何文档吗?
  • 不,我不知道,这只是一个猜测,这就是为什么我说:“看起来……”。我确定它在文档中的某个地方,但在哪里?!!
  • 我怀疑答案是this。以下示例显示了奇怪的行为:declare @X as Int = 1, @Y as Int = 2, @Z as Int = 3; declare @Samples as Table ( Col Int ); insert into @Samples ( Col ) values ( 42 ); select @X as '@X', @Y as '@Y', @Z as '@Z', Col from @Samples; update @Samples set @X = @Y, @Y += 1, @Z = @Y; select @X as '@X', @Y as '@Y', @Z as '@Z', Col from @Samples; update @Samples set @X = @Y, @Y += 1, @Z = ( select @Y ); select @X as '@X', @Y as '@Y', @Z as '@Z', Col from @Samples;.
【解决方案2】:

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

是标准 SQL-92; != 是它的等价物。两者都评估值,NULL 不是 - NULL 是一个占位符,表示没有值。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多