如何在 SELECT 中声明变量?
How to declare variable within a SELECT?
我有一个计算报告刷新时间的长查询,如果报告没有在“预定”时间刷新,那么它会延迟显示,具体情况如下:
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
如果我没听错,你可以使用 VALUES()
和一个横向连接只计算一次:
SELECT
CASE
WHEN CS.StartTime > CURRENT_TIMESTAMP THEN 'STARTING LATER'
WHEN x.timing < 30 THEN 'Less than half hour late!'
WHEN x.timing >= 30 THEN 'More than half hour Late!'
ELSE '???'
END as RefreshStartStatus,
CASE WHEN CS.StartTime <= CURRENT_TIMESTAMP THEN CONCAT(x.timing ' mins late') END as info
FROM #CSTempTable CS
LEFT OUTER JOIN #SubscriptionAggTempTable SA ON SA.SubscriptionID = CS.SubscriptionID
CROSS APPLY (VALUES (DATEDIFF(MINUTE, CS.StartTime, SA.TodayFirstRunTime))) as x(timing)
我有一个计算报告刷新时间的长查询,如果报告没有在“预定”时间刷新,那么它会延迟显示,具体情况如下:
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
如果我没听错,你可以使用 VALUES()
和一个横向连接只计算一次:
SELECT
CASE
WHEN CS.StartTime > CURRENT_TIMESTAMP THEN 'STARTING LATER'
WHEN x.timing < 30 THEN 'Less than half hour late!'
WHEN x.timing >= 30 THEN 'More than half hour Late!'
ELSE '???'
END as RefreshStartStatus,
CASE WHEN CS.StartTime <= CURRENT_TIMESTAMP THEN CONCAT(x.timing ' mins late') END as info
FROM #CSTempTable CS
LEFT OUTER JOIN #SubscriptionAggTempTable SA ON SA.SubscriptionID = CS.SubscriptionID
CROSS APPLY (VALUES (DATEDIFF(MINUTE, CS.StartTime, SA.TodayFirstRunTime))) as x(timing)