3

実行可能ファイルのランタイムを取得するクエリがあります。データベースには、開始時刻と終了時刻が含まれています。実行の合計時間を取得したいと思います。これまでのところ、私は持っています:

SELECT startTime, endTime,
cast(datediff(hh,starttime,endtime) as varchar)
+':'
+cast(datediff(mi,starttime,endtime)-60*datediff(hh,starttime,endtime) as varchar) AS RUNTIME
FROM applog
WHERE runID = 33871
ORDER BY startTime DESC 

これを実行すると、期待値と予期しない値が得られます。たとえば、starttime = 2008-11-02 15:59:59.790 および endtime = 2008-11-02 19:05:41.857 の場合、ランタイムは = 4:-54 です。この場合、MS SQL SMS でクエリを取得して値 3:06 を返すにはどうすればよいですか?

ありがとう。

私が答えとして選択したEoin Campbell'sは、私のニーズに最も適しています. David B'sも同様に実行可能です。

4

4 に答える 4

3

これらを試してください

宣言された日付が 2 つあると仮定します。

declare @start datetime
set @start = '2008-11-02 15:59:59.790'

declare @end datetime
set @end = '2008-11-02 19:05:41.857'

これは時間/分/秒を返します

select 
    (datediff(ss, @start, @end) / 3600), 
    (datediff(ss, @start, @end) / 60) % 60,
    (datediff(ss, @start, @end) % 60) % 60

--returns

----------- ----------- -----------
3           5           42

これは、ゼロで埋められた連結文字列バージョンです

select
RIGHT('0' + CONVERT(nvarchar, (datediff(ss, @start, @end) / 3600)), 2) + ':' +
RIGHT('0' + CONVERT(nvarchar, (datediff(ss, @start, @end) / 60) % 60), 2) + ':' +
RIGHT('0' + CONVERT(nvarchar, (datediff(ss, @start, @end) % 60) % 60), 2)

--------
03:05:42
于 2008-11-03T22:43:41.343 に答える
1

datediff() への呼び出しと一貫性を保つ必要があります。それらはすべて同じ datepart 引数を使用する必要があります。

MSDN の DATEDIFF (Transact-SQL) の記事を参照してください。

あなたの例では、「mi」と「hh」の両方を使用して連結しています。

期間の最小公分母 (おそらく ss または s) を選択し、それに基づいて計算を行います (他の回答が示しているように、実際には説明していません)。

于 2008-11-03T22:54:04.803 に答える
1

これを行う方法は次のとおりです。

-- Find Hours, Minutes and Seconds in between two datetime
DECLARE @First datetime
DECLARE @Second datetime
SET @First = '04/02/2008 05:23:22'
SET @Second = getdate()

SELECT DATEDIFF(day,@First,@Second)*24 as TotalHours,
DATEDIFF(day,@First,@Second)*24*60 as TotalMinutes,
DATEDIFF(day,@First,@Second)*24*60*60 as TotalSeconds
于 2008-11-03T22:27:47.007 に答える
0

計算ロジックとプレゼンテーション ロジックを分離する必要があります。

DECLARE @applog TABLE
(
  runID int,
  starttime datetime,
  endtime datetime
)

INSERT INTO @applog (runID, starttime, endtime)
SELECT 33871, '2008-11-02 15:59:59.790', '2008-11-02 19:05:41.857'
-------------------
SELECT
  SUBSTRING(convert(varchar(30), DateAdd(mi, duration, 0), 121),
  12, 5) as prettyduration
FROM
(
SELECT starttime, DateDiff(mi, starttime, endtime) as duration
FROM @applog
WHERE runID = 33871
) as sub

24 時間以上を表す必要がある場合は、別のプレゼンテーション ロジックを使用します。これは私が最も速く考えることができたものです。

于 2008-11-03T22:36:53.137 に答える