显示准确计时
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())
经过运行再查询结果为:
我有以下查询
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())
经过运行再查询结果为: