逾期 -10 表示逾期 10 分钟。将'-10'交换为逾期10分钟
Overdue by -10 which means overdue by 10 minutes. Swap the '-10' to overdue by 10 minutes
CASE WHEN Color LIKE '%RED%' THEN (10 - (DATEDIFF(MINUTE,Calltime,GETDATE())))
有时可能会给出 -10 值。我的问题是,当我得到一个 <0 的值时,如何将该值更改为逾期 10 分钟。
您可以嵌套 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 中使用另一个 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)
我更喜欢在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提供逻辑代码。
CASE WHEN Color LIKE '%RED%' THEN (10 - (DATEDIFF(MINUTE,Calltime,GETDATE())))
有时可能会给出 -10 值。我的问题是,当我得到一个 <0 的值时,如何将该值更改为逾期 10 分钟。
您可以嵌套 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 中使用另一个 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)
我更喜欢在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提供逻辑代码。