1

私は Teradata で作業しており、ジョブが完了する平均時間を計算しようとしています。

データ値:

Job Name            Start Date  End Date    End Time
D_BDW_CCIP_SRM_LD   10/10/2012  10/11/2012  01:41:49
D_BDW_CCIP_SRM_LD   10/9/2012   10/10/2012  00:19:56
D_BDW_CCIP_SRM_LD   10/8/2012   10/8/2012   23:37:18
D_BDW_CCIP_SRM_LD   10/5/2012   10/5/2012   23:39:47
D_BDW_CCIP_SRM_LD   10/4/2012   10/4/2012   23:42:47
D_BDW_CCIP_SRM_LD   10/3/2012   10/3/2012   23:41:54

平均は 00:07 ではなく 16:07 で戻ってきています。私が起こる必要があるのは、次の日に仕事が終わる計算が時間の伸びを理解することです。

Excel では、終了時刻に 1 日を追加し、平均して時間として表示することでこれを行うことができます。

Teradata でこれを行うにはどうすればよいですか?

4

3 に答える 3

1

これはとても興味深い質問です! 正しい構文で更新: START_DATEとEND_DATEがDATE値であり、END_TIMEが値であると仮定するとTIME、次の解決策があります。

select cast( avg( case
                  when start_date <> end_date
                  then extract(second from end_time)
                     + extract(minute from end_time) * 60 
                     + extract(hour   from end_time) * 3600
                     + 86400
                  else extract(second from end_time) 
                     + extract(minute from end_time) * 60 
                     + extract(hour   from end_time) * 3600
                  end) mod 86400) as decimal(10,4))
      * INTERVAL '00:00:01.00' HOUR TO SECOND as avg_time
from   your_table

CASEExcelを使用して、真夜中からの平均秒数を中間結果に決定し、列に変換するときに提案したように、式は1日(86,400秒)を「追加」しますTIME

公平を期すために、結果をフォーマットするTeradata Forumから助けを受けましたが、私はこれがとても好きで、自分で使用します。

于 2012-10-12T19:13:25.673 に答える
0

これでうまくいくようですが、別の方法があるかどうか見てみたいと思います。

SELECT job_name,
    case when avg_end_time_in_minutes  > 60*24 then avg_end_time_in_minutes - 60*24 
         else avg_end_time_in_minutes end as avg_adjusted,
case when max_end_time_in_minutes  > 60*24 then max_end_time_in_minutes - 60*24 
     else max_end_time_in_minutes end as max_adjusted,
CAST((CAST(avg_adjusted / 60  AS INTEGER) (FORMAT '9(2)')) AS CHAR(2))||':'||
CAST((CAST((avg_adjusted / 60 MOD 1)*60  AS INTEGER) (FORMAT '9(2)')) AS CHAR(2)) 
                        avg_adjusted_time,
CAST((CAST(max_adjusted / 60  AS INTEGER) (FORMAT '9(2)')) AS CHAR(2))||':'||
CAST((CAST((max_adjusted / 60 MOD 1)*60  AS INTEGER) (FORMAT '9(2)')) AS CHAR(2)) 
                           max_adjusted_time
FROM (
SELECT job_name,
    AVG(end_time_in_minutes) avg_end_time_in_minutes,
    MAX(CAST(end_time_in_minutes AS DECIMAL(8,2))) max_end_time_in_minutes
FROM (
SELECT job_name,
    CAST(substr(end_time, 1, 2) AS INTEGER)*60
        + CAST(substr(end_time, 4, 2) AS INTEGER) 
        + cast(end_date - start_date as integer)*60*24 AS end_time_in_minutes
FROM dabank_prod_ops_tb.bdw_tables_load_tracker_view a          
WHERE a.status = 'COMPLETED' 
AND a.start_date BETWEEN CURRENT_DATE - 31 AND CURRENT_DATE -1
AND a.end_time IS NOT NULL
) a
GROUP BY 1
) b
于 2012-10-11T16:03:20.370 に答える
0

まず、開始日の午前 0 時から終了時刻までの秒数を計算します。次に、それを使用して平均所要秒数を計算し、それを午前 0 時に加算して、平均終了時間を見つけることができます。

select
    avg(extract(second from end_time) + 60 *
        (extract(minute from end_time) + 60 *
        (extract(hour from end_time) + 24 *
        (end_date - start_date))) as avg_duration_in_seconds
    cast(avg_duration_in_seconds / 60 / 60 as integer) as avg_hours
    mod(cast(avg_duration_in_seconds / 60 as integer), 60) as avg_minutes
    mod(cast(avg_duration_in_seconds as integer), 60) as avg_seconds,
    cast('00:00:00' as time) +
        cast(avg_hours as interval hour) +
        cast(avg_minutes as interval minute) +
        cast(avg_seconds as interval second) as avg_end_time
from my_table

ただし、平均が 24 時間を超える場合、 avg_end_time は00:01:15ではなく のようになることに注意してください24:01:15

于 2012-10-12T00:57:48.253 に答える