17

開始時刻と終了時刻を含むデータが与えられた場合、時間、分、秒、および平均の長さで合計の長さを計算する必要があります。

たとえば、結果は、45:15:1045 時間 15 分 10 秒、または30:0730 分 07 秒を意味するようなものでなければなりません。

を使用してSQL Server 2008 R2おり、時間が を超えると変換に失敗しました24:59:59。どうすればこれを行うことができるか考えていますか?

参考までに、表の列はIdStartDateTimeEndDateTimeなどです。月の録音数、これらのレコードの合計の長さ、および平均の長さを含む月次レポートを作成する必要があります。これらすべてを簡単に実行する方法があれば知りたいです。

4

7 に答える 7

11

に変換するべきではありません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:33
2   2013-01-21 14:24:46  2013-01-21 14:46:46   0:22:00        42:10:33
3   2013-01-20 14:24:46  2013-01-21 14:29:46  24:05:00        42:10:33
4   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] = CASE 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:0022:00ます。

于 2013-01-21T19:25:15.457 に答える
3
SELECT CONVERT(time, 
               DATEADD(mcs, 
                       DATEDIFF(mcs, 
                                '2007-05-07 09:53:00.0273335', 
                                '2007-05-07 09:53:01.0376635'), 
                       CAST('1900-01-01 00:00:00.0000000' as datetime2)
                      )
              )
于 2015-04-30T03:07:26.460 に答える
2

平均を計算する場合、最善の方法は、1 日の秒数または端数に変換することです。次のようなことができるため、日分数は SQL Server で便利です。

select avg(cast(endtime - starttime) as float)
from t

datetime逆キャストを使用して、それを に戻すことができます。

select cast(avg(cast(endtime - starttime as float) as datetime)
from t

必要な形式で時間を取得するための算術演算。. . それは苦痛です。最終形式に日を含め、次を使用することを検討してください。

select right(convert(varchar(255), <val>, 120), 10)

24 時間を超える時間を取得するには、別の方法を次に示します。

select cast(floor(cast(<val> as float)*24) as varchar(255))+right(convert(varchar(255), <val>, 120), 6)

分と秒に使用convertされ、左側に 0 を埋め込む必要があります。次に、時間を個別の値として追加します。

于 2013-01-21T19:26:21.947 に答える
0

daysが (正の) 日数 ( 12 時間など) の場合、次の0.5式を使用して適切な期間としてフォーマットします。

CONVERT(varchar(9), FLOOR(days * 24)) + RIGHT(CONVERT(char(19), CAST(days AS datetime), 120), 6)

Excel は9999:59:59、貼り付けた時点までの値を理解します。カスタム形式が適用されます:[h]:mm:ss英語版 ([u]:mm:ssオランダ語用)。

于 2021-10-14T16:23:54.263 に答える