显示准确计时

Display accurate timing

我有以下查询

SELECT
    CASE 
        WHEN CS.StartTime > CURRENT_TIMESTAMP THEN 'STARTING LATER'
        WHEN x.timing <  30 THEN 'A LITTLE LATE' 
        WHEN x.timing >= 30 THEN 'VERY LATE'
        ELSE 'Unknown Status'
    END as RefreshStartStatus,
    CASE WHEN CS.StartTime <= CURRENT_TIMESTAMP THEN CONCAT(x.timing ', min(s) 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)

示例结果:

RefreshStartStatus  info
A LITTLE LATE       0 min(s) late
STARTING LATER      NULL
A LITTLE LATE       9 min(s) late
A LITTLE LATE       0 min(s) late
STARTING LATER      NULL
A LITTLE LATE       0 min(s) late
VERY LATE           46 min(s) late
Unknown Status      min(s) late
A LITTLE LATE       0 min(s) late

这很好,但是 0 有点误导。可能是毫秒的差异导致刷新有点晚,那么我怎样才能让这个显示准确的时间呢?

例如

A LITTLE LATE       2 sec(s) late
A LITTLE LATE       1 min(s) late

或者如果这样做很复杂,那么

A LITTLE LATE       0.03 min(s) late
A LITTLE LATE       1 min(s) late

注意:2 秒等于 0.0333 分钟

然后以秒为单位计算差异,然后进行数学计算:

SELECT
    CASE 
        WHEN CS.StartTime > CURRENT_TIMESTAMP THEN 'STARTING LATER'
        WHEN x.timing <  30 * 60 THEN 'A LITTLE LATE' 
        WHEN x.timing >= 30 * 60 THEN 'VERY LATE'
        ELSE 'Unknown Status'
    END as RefreshStartStatus,
    CASE WHEN CS.StartTime <= CURRENT_TIMESTAMP THEN CONCAT(x.timing / 60.0,  ' min(s) late') END as info
FROM #CSTempTable CS
LEFT OUTER JOIN #SubscriptionAggTempTable SA ON SA.SubscriptionID = CS.SubscriptionID
CROSS APPLY (VALUES (DATEDIFF(SECOND, CS.StartTime, SA.TodayFirstRunTime))) as x(timing)

您可能想要格式化、舍入或截断除法结果,以防它没有给出精确的结果,例如:

CONCAT(CONVERT(DECIMAL(10, 2), x.timing / 60.0),  ' min(s) late')

或者,如果您只想显示重要的小数位,请使用 FORMAT():

CONCAT(FORMAT(x.timing / 60.0, '0.##'),  ' min(s) late')

您可以将此用于小于 60 秒的延迟和大于 60 秒的延迟

 SELECT
CASE 
    WHEN CS.StartTime > CURRENT_TIMESTAMP THEN 'STARTING LATER'
    WHEN x.timing <  1800*1000 THEN 'A LITTLE LATE' 
    WHEN x.timing >= 1800*1000 THEN 'VERY LATE'
    ELSE 'Unknown Status'
END as RefreshStartStatus,
CASE WHEN CS.StartTime <= CURRENT_TIMESTAMP THEN 
    CASE WHEN x.timing < 1000 THEN
        CONCAT(x.timing ,', millisecond(s) late')
    WHEN x.timing < 60000 THEN
        CONCAT(x.timing/1000 ,', Second(s) late')
    ELSE
        CONCAT(x.timing/60000 ,', min(s) late')
    END
ELSE
CASE WHEN ABS(x.timing) < 1000 THEN
        CONCAT(ABS(x.timing) ,', millisecond(s) until it starts')
    WHEN ABS(x.timing) < 60000 THEN
        CONCAT(ABS(x.timing)/1000 ,', Second(s) until it starts')
    ELSE
        CONCAT(ABS(x.timing)/60000 ,', min(s) until it starts')
    END
END as info
FROM #CSTempTable CS
LEFT OUTER JOIN #SubscriptionAggTempTable SA ON SA.SubscriptionID = CS.SubscriptionID
CROSS APPLY (VALUES (DATEDIFF(MILLISECOND, CS.StartTime, SA.TodayFirstRunTime))) as x(timing)

我创建了两个临时文件 table 并测试了结果:

CREATE TABLE #CSTempTable
(
StartTime dateTime,
SubscriptionID int
)
CREATE TABLE #SubscriptionAggTempTable
(
SubscriptionID int,
TodayFirstRunTime datetime
)

并在 tables

中插入两行
 INSERT INTO #CSTempTable
VALUES (DATEADD(SECOND,-10,GETDATE()),1)

INSERT INTO #CSTempTable
VALUES (DATEADD(SECOND,10,GETDATE()),1)

INSERT INTO #CSTempTable
VALUES (DATEADD(MILLISECOND,-150,GETDATE()),1)

INSERT INTO #CSTempTable
VALUES (DATEADD(SECOND,-170,GETDATE()),1)

INSERT INTO #SubscriptionAggTempTable
VALUES (1,GETDATE())

经过运行再查询结果为: