如何在 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)