time
に変換するべきではありません -期間や間隔ではなく、単一の24時間クロックで特定の時点を保存することを意図しています(それ自体が24時間未満に制限されている場合でも、データは明らかにそうではありません)。代わりに、必要な最小の間隔 (この場合は秒) で datediff を取得し、数学と文字列操作を実行して、必要な出力形式で表示することができます (秒をアプリケーションまたはアプリケーションに返すことも望ましい場合があります)。ツールを報告し、この作業を実行させます)。
DECLARE @d TABLE( id INT IDENTITY(1,1), StartDateTime DATETIME, EndDateTime DATETIME);INSERT @d(StartDateTime, EndDateTime) VALUES (DATEADD(DAY, -2, GETDATE()), DATEADD (MINUTE, 15, GETDATE())),(GETDATE() , DATEADD(MINUTE, 22, GETDATE())),(DATEADD(DAY, -1, GETDATE()), DATEADD(MINUTE, 5, GETDATE() )),(DATEADD(DAY, -4, GETDATE()), DATEADD(SECOND, 14, GETDATE()));;WITH x AS (SELECT id, StartDateTime, EndDateTime, d =DATEDIFF(SECOND, StartDateTime, EndDateTime) , a =AVG(DATEDIFF(SECOND, StartDateTime, EndDateTime)) OVER() FROM @d)SELECT id, StartDateTime, EndDateTime, [delta_HH:MM:SS] =CONVERT(VARCHAR(5), d/60/60) + ':' + RIGHT('0' + CONVERT(VARCHAR(2), d/60%60), 2) + ':' + RIGHT('0' + CONVERT(VARCHAR(2), d % 60), 2 )、[avg_HH:MM:SS] =CONVERT(VARCHAR(5), a/60/60) + ':' + RIGHT('0' + CONVERT(VARCHAR(2), a/60%60), 2) + ':' + RIGHT('0' + CONVERT(VARCHAR(2), a % 60), 2)FROM x;
プレ>結果:
id StartDateTime EndDateTime delta_HH:MM:SS avg_HH:MM:SS-- ------------------- ---------- --------- -------------- ------------1 2013-01-19 14:24:46 2013-01- 21 14:39:46 48:15:00 42:10:332 2013-01-21 14:24:46 2013-01-21 14:46:46 0:22:00 42:10:333 2013-01- 20 14:24:46 2013-01-21 14:29:46 24:05:00 42:10:334 2013-01-17 14:24:46 2013-01-21 14:25:00 96:00:14 42:10:33コード> プレ>
デルタが 1 時間未満の場合、MM:SS だけが表示されるわけではないため、これは正確にはあなたが求めたものではありません。シンプルな
CASE
で調整できます 式:;WITH x AS (SELECT id, StartDateTime, EndDateTime, d =DATEDIFF(SECOND, StartDateTime, EndDateTime), a =AVG(DATEDIFF(SECOND, StartDateTime, EndDateTime)) OVER() FROM @d)SELECT id, StartDateTime, EndDateTime, [delta_HH:MM:SS] =CASE WHEN d>=3600 THEN CONVERT(VARCHAR(5), d/60/60) + ':' ELSE '' END + RIGHT('0' + CONVERT (VARCHAR(2), d/60%60), 2) + ':' + RIGHT('0' + CONVERT(VARCHAR(2), d % 60), 2), [avg_HH:MM:SS] =ケースWHEN a>=3600 THEN CONVERT(VARCHAR(5), a/60/60) + ':' ELSE '' END + RIGHT('0' + CONVERT(VARCHAR(2), a/60%60), 2) + ':' + RIGHT('0' + CONVERT(VARCHAR(2), a % 60), 2)FROM x;
プレ>このクエリは、上記の結果の 2 行目のデルタ列を
0:22:00
から変更します。22:00
まで .