【发布时间】:2021-03-15 20:27:00
【问题描述】:
我有一个计算报告刷新时间的长查询,如果报告没有在“计划”时间刷新,那么它会延迟显示,根据以下情况:
SELECT
RefreshStartStatus = CASE
WHEN CS.StartTime > CURRENT_TIMESTAMP THEN 'STARTING LATER'
WHEN DATEDIFF(MINUTE, CS.StartTime, SA.TodayFirstRunTime) < 30 THEN 'Less than half hour late!' -- less than 30 mins late
WHEN DATEDIFF(MINUTE, CS.StartTime, SA.TodayFirstRunTime) >= 30 THEN 'More than half hour Late!' -- 30 mins late
ELSE '???'
END
FROM #CSTempTable CS
LEFT OUTER JOIN #SubscriptionAggTempTable SA
ON SA.SubscriptionID = CS.SubscriptionID
我想进一步增强这一点,并显示实际时间有多晚。
由于我使用过脚本(例如 PowerShell),所以它会很简单
WHEN DATEDIFF(MINUTE, CS.StartTime, SA.TodayFirstRunTime) < 30 THEN "$(DATEDIFF(MINUTE, CS.StartTime, SA.TodayFirstRunTime)) late!"
但当然,这里的 SQL 查询不是这种情况,那么我将如何输出延迟多长时间的实际值?我想过像这样声明和设置一个标量变量:
DECLARE @timing int;
SET @timing = DATEDIFF(MINUTE, CS.StartTime, SA.TodayFirstRunTime);
WHEN @timing < 30 THEN @timing + ' mins late!'
但我不知道如何在 SELECT 语句中执行此操作,因为由于执行差异所需的连接,该值是在其中生成的...
结果是这样的:
SELECT
DECLARE @timing int;
SET @timing = DATEDIFF(MINUTE, CS.StartTime, SA.TodayFirstRunTime);
RefreshStartStatus = CASE
WHEN CS.StartTime > CURRENT_TIMESTAMP THEN 'STARTING LATER'
WHEN timing < 30 THEN @timing + ' mins late! a little late' -- less than 30 mins late
WHEN timing >= 30 THEN timing + ' mins Late! VERY LATE!' -- 30+ mins late
ELSE '???'
END
FROM #CSTempTable CS
LEFT OUTER JOIN #SubscriptionAggTempTable SA
ON SA.SubscriptionID = CS.SubscriptionID
【问题讨论】:
-
您可以在一个语句号内开始一个语句。如果你需要创建变量,你需要
DECLARE他们在SELECT之外。
标签: sql sql-server tsql left-join lateral-join