计算24小时内的平均时间

时间:2012-10-11 15:48:32

标签: sql time average teradata

我在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

平均值以16:07而不是00:07回归。我需要做的是,第二天工作完成的计算理解时间的扩展。

在Excel中我可以通过在结束时间添加一天然后平均并显示为时间来完成此操作。

如何在Teradata中执行此操作?

3 个答案:

答案 0 :(得分: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

使用Excel确定从午夜到中间结果并转换为CASE列的平均秒数时,TIME表达式“添加”一天(86,400秒)。

公平地说,我收到了Teradata Forum格式化结果的帮助,但我非常喜欢这个,我会自己使用它。

答案 1 :(得分: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

答案 2 :(得分: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