【问题标题】:Overdue by -10 which means overdue by 10 minutes. Swap the '-10' to overdue by 10 minutes [closed]逾期 -10 表示逾期 10 分钟。将“-10”交换为逾期 10 分钟 [关闭]
【发布时间】:2021-03-27 16:00:16
【问题描述】:
CASE WHEN Color LIKE '%RED%' THEN (10 - (DATEDIFF(MINUTE,Calltime,GETDATE()))) 

有时可能会给出 -10 的值。我的问题是当我得到一个

【问题讨论】:

  • 请显示示例数据和预期结果。
  • 你要实现的逻辑是什么?

标签: sql sql-server tsql case-when


【解决方案1】:

您可以嵌套 CASE 语句,但由于您现在将文本引入整数值,因此您必须将所有输出转换为字符串:

CASE WHEN Color LIKE '%RED%' THEN
    CASE WHEN (10 - (DATEDIFF(MINUTE,Calltime,GETDATE()))) >= 0 THEN CAST((10 - (DATEDIFF(MINUTE,Calltime,GETDATE()))) AS VARCHAR(MAX))
    ELSE CAST(ABS((10 - (DATEDIFF(MINUTE,Calltime,GETDATE())))) AS VARCHAR(MAX)) + ' minutes overdue'
    END
ELSE -- Additional SQL for when color is not red
END

【讨论】:

  • 这是一个case 表达式,而不是语句
【解决方案2】:

只需在 CASE 内使用另一个 CASE END。试试这个:

CASE WHEN Color LIKE '%RED%' THEN (CASE WHEN (10 - (DATEDIFF(MINUTE,Calltime,GETDATE()))) < 0 THEN 10 ELSE (10 - (DATEDIFF(MINUTE,Calltime,GETDATE()))) END)

【讨论】:

    【解决方案3】:

    我更喜欢计算 lateral join 中的共同值,而不是多次重复我的逻辑。

    DECLARE @Test TABLE (CallTime DATETIME, Color VARCHAR(12));
    
    INSERT INTO @Test (Color, CallTime)
    SELECT 'RED', DATEADD(MINUTE, -5, GETDATE())
    UNION ALL SELECT 'RED', DATEADD(MINUTE, -12, GETDATE())
    UNION ALL SELECT 'BLUE', DATEADD(MINUTE, -5, GETDATE());
    
    SELECT
        CASE WHEN T.Color LIKE '%RED%' THEN
            CASE WHEN C.CallDifference >= 0 THEN CAST(C.CallDifference AS VARCHAR(MAX))
            ELSE CAST(ABS(C.CallDifference) AS VARCHAR(MAX)) + ' minutes overdue'
            END
        ELSE 'BLUE'
        END
    FROM @Test T
    CROSS APPLY (VALUES(10 - (DATEDIFF(MINUTE,T.Calltime,GETDATE())))) as C (CallDifference);
    

    感谢 e_i_pi 提供逻辑代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 2011-01-12
      • 2019-06-30
      • 2020-09-01
      • 1970-01-01
      相关资源
      最近更新 更多