【发布时间】:2020-02-27 16:09:57
【问题描述】:
如何在 T-SQL 中简化这个 case 语句?它提供了所需的结果,但非常笨重且难以阅读。我必须使用内部 case 语句将儒略日期(又名 6 位数字)转换为常规日期格式。
基本上我在做一个 datediff(getdate(), case statement)。 Getdate() 只返回现在的时间(即 2/27/2020),case 语句将儒略日期(即 123456)转换为正常日期(即 2020 年 1 月 1 日)。
如果查询是在 2 月 27 日今天运行的,那么这是预期的输出。
Select CASE
WHEN Datediff(day, Getdate(), CASE
WHEN a.wadpl = 0
THEN NULL
ELSE Dateadd(d, Substring(Cast(wadpl AS VARCHAR(6)), 4, 3) - 1, CONVERT(DATETIME, CASE
WHEN LEFT(Cast(wadpl AS VARCHAR(6)), 1) = '1'
THEN '20'
ELSE '21'
END + Substring(Cast(wadpl AS VARCHAR(6)), 2, 2) + '-01-01'))
END) < 0
THEN 'Overdue Now'
WHEN Datediff(day, Getdate(), CASE
WHEN a.wadpl = 0
THEN NULL
ELSE Dateadd(d, Substring(Cast(wadpl AS VARCHAR(6)), 4, 3) - 1, CONVERT(DATETIME, CASE
WHEN LEFT(Cast(wadpl AS VARCHAR(6)), 1) = '1'
THEN '20'
ELSE '21'
END + Substring(Cast(wadpl AS VARCHAR(6)), 2, 2) + '-01-01'))
END) <= 30
THEN 'Coming due in 01-30 days'
ELSE 'Not Overdue'
END [Overdue Status]
FROM Table_X
【问题讨论】:
-
如果您还包括一些示例数据以及该查询应该做什么的说明,您可能会在此处获得最佳结果。
-
case试图做什么简单的英语?这可能有助于简化它...... -
对于codereview.stackexchange.com来说可能是一个更好的问题
-
仅供参考,这是
CASE表达式,而不是Case(Switch) 语句。两者完全不同,不应混淆。 SQL Server 不支持 2 中的后者。 -
你不能把内部CASE的逻辑放在一个UDF里面吗?
标签: sql sql-server tsql case