3

質問があります

select
  *,
  right(
    convert(varchar, cast(JOB_DONE_time-JOB_send_time as datetime), 121),
    12
  ) [TimeTaken]
from dbo.insert_data
order by job_id desc  

このクエリの結果は次のようになります

JOB_ID     JOB_DONE_TIME            JOB_SEND_TIME            TimeTaken
---------  -----------------------  -----------------------  ------------
001-99900  2011-12-28 13:36:57.860  2011-12-28 13:36:57.593  00:00:00.267
001-99800  2011-12-28 13:36:57.843  2011-12-28 13:36:57.593  00:00:00.250
001-99700  2011-12-28 13:36:57.687  2011-12-28 13:36:57.547  00:00:00.140
001-99600  2011-12-28 13:36:57.593  2011-12-28 13:36:57.547  00:00:00.047
001-99500  2011-12-28 13:36:57.563  2011-12-28 13:36:57.437  00:00:00.127
001-99400  2011-12-28 13:36:57.547  2011-12-28 13:36:57.437  00:00:00.110
001-99300  2011-12-28 13:36:57.483  2011-12-28 13:36:57.377  00:00:00.107
001-99200  2011-12-28 13:36:57.437  2011-12-28 13:36:57.377  00:00:00.060
001-99100  2011-12-28 13:36:57.407  2011-12-28 13:36:57.187  00:00:00.220
001-99000  2011-12-28 13:36:57.360  2011-12-28 13:36:57.187  00:00:00.173
001-9900   2011-12-28 13:32:22.657  2011-12-28 13:32:22.500  00:00:00.127

このクエリによって、TimeTaken列を取得しました。今、私は加算と平均を計算したいと思います。列のtimetakenSUM()関数を試してみましたが、エラーが発生します:

メッセージ 8117、レベル 16、状態 1、行 1 オペランドのデータ型 varchar は合計演算子に対して無効です。

どうやって計算するの???

4

4 に答える 4

1

すでに言われているように、問題は文字列列に適用しようとしているという事実に関係していますが、AVG()実際SUM()にはこれらの関数は数値列でしか使用できません。

非常に SQL Server 固有のソリューションとして、一時的に to の結果をキャストJOB_DONE_time - JOB_send_timefloat、計算AVG()および/またはSUM()結果を に戻し、次に に変換し、datetime集計varcharされていない結果に対して現在行っているように、最後の 12 文字を抽出することができます。減算の。

これが私が意味することの例です:

SELECT
  JOB_ID,
  JOB_DONE_TIME,
  JOB_SEND_TIME,
  TimeTaken      = RIGHT(CONVERT(varchar(30), CAST(    TimeTakenFP          AS datetime), 121), 12),
  AvgTimeTaken   = RIGHT(CONVERT(varchar(30), CAST(AVG(TimeTakenFP) OVER () AS datetime), 121), 12),
  TotalTimeTaken = RIGHT(CONVERT(varchar(30), CAST(SUM(TimeTakenFP) OVER () AS datetime), 121), 12)
FROM (
  SELECT
    *,
    TimeTakenFP = CAST(JOB_DONE_TIME - JOB_SEND_TIME AS float)
  FROM insert_data
) s
;

サンプル データの場合、上記のクエリは次の結果セットを返します。

JOB_ID JOB_DONE_TIME JOB_SEND_TIME 所要時間 平均所要時間 合計所要時間
---------- -------------------------------------- ------------------ ----- ------------ ------------ --------------
001-99900 2011-12-28 13:36:57.860 2011-12-28 13:36:57.593 00:00:00.267 00:00:00.150 00:00:01.657
001-99800 2011-12-28 13:36:57.843 2011-12-28 13:36:57.593 00:00:00.250 00:00:00.150 00:00:01.657
001-99700 2011-12-28 13:36:57.687 2011-12-28 13:36:57.547 00:00:00.140 00:00:00.150 00:00:01.657
001-99600 2011-12-28 13:36:57.593 2011-12-28 13:36:57.547 00:00:00.047 00:00:00.150 00:00:01.657
001-99500 2011-12-28 13:36:57.563 2011-12-28 13:36:57.437 00:00:00.127 00:00:00.150 00:00:01.657
001-99400 2011-12-28 13:36:57.547 2011-12-28 13:36:57.437 00:00:00.110 00:00:00.150 00:00:01.657
001-99300 2011-12-28 13:36:57.483 2011-12-28 13:36:57.377 00:00:00.107 00:00:00.150 00:00:01.657
001-99200 2011-12-28 13:36:57.437 2011-12-28 13:36:57.377 00:00:00.060 00:00:00.150 00:00:01.657
001-99100 2011-12-28 13:36:57.407 2011-12-28 13:36:57.187 00:00:00.220 00:00:00.150 00:00:01.657
001-99000 2011-12-28 13:36:57.360 2011-12-28 13:36:57.187 00:00:00.170 00:00:00.150 00:00:01.657
001-9900 2011-12-28 13:32:22.657 2011-12-28 13:32:22.500 00:00:00.157 00:00:00.150 00:00:01.657

このクエリは、ウィンドウ集計関数を使用して集計結果を計算するため、集計結果と非集計結果の両方を確認できます。時間を表示する方法を非集計結果と集計結果の両方に適用できる方法を示したかったため、ウィンドウ関数のみを使用しました。これにより、必要な結果の種類に応じて式のどの部分が変化するかを確認できます。時間表現に変換します。実際には、必要に応じて、「通常の」集計結果 (および必要に応じてグループ化) を使用できます。

SQL Fiddle でクエリの「ライブ」デモンストレーションを試すことができます。

于 2012-07-28T14:39:36.720 に答える
0

DATEDIFF が必要だと思います (申し訳ありませんが、今は試すことができません)。

あなたの場合:

select avg(DATEDIFF(Millisecond, JOB_DONE_time, JOB_send_time)) from dbo.insert_data
于 2012-07-28T09:37:44.540 に答える
0

SQLでavg関数を使用すると、列の平均が得られます

SELECT AVG(column name) FROM tabelname;

そして、このような合計使用のために

 SELECT sum(column name)  FROM tabelname;
于 2012-07-28T09:22:12.967 に答える
0

done 列と send time 列の datediff をミリ秒単位で決定し、それらの結果を平均または合計することができます

select sum(datediff(ms, JOB_send_time, JOB_DONE_time)) as SUM_Timing
,      avg(datediff(ms, JOB_send_time, JOB_DONE_time)) as AVG_Timing
from   dbo.insert_data
于 2012-07-28T09:36:57.817 に答える