시간 평균을 구하고 싶어요. 1 5 2,588

by 창조의날개 [2015.03.31 09:56:09]


 

먼저 아래와 같은 소요 시간이 들어 있는 테이블이 있습니다.

 


WITH TT AS(
          SELECT '01:00:00' T FROM DUAL UNION ALL
          SELECT '02:00:00' T FROM DUAL UNION ALL
          SELECT '03:00:00' T FROM DUAL UNION ALL
          SELECT '04:00:00' T FROM DUAL
)
SELECT T
FROM TT
;

 

이 소요 시간의 평균을 구하고 싶은데요..

그냥 단순 하게 생각해서 아래와 같이 만들었습니다.

 


WITH TT AS(
      SELECT ROUND(AVG(TO_NUMBER(REGEXP_SUBSTR(T,'[^:]+',1,1))*60*60
           + TO_NUMBER(REGEXP_SUBSTR(T,'[^:]+',1,2))*60
           + TO_NUMBER(REGEXP_SUBSTR(T,'[^:]+',1,3)))) T_SEC
      FROM (
            SELECT '01:00:00' T FROM DUAL UNION ALL
            SELECT '02:00:00' T FROM DUAL UNION ALL
            SELECT '03:00:00' T FROM DUAL UNION ALL
            SELECT '04:00:00' T FROM DUAL
            )
)
SELECT T_SEC
     , TO_CHAR(TRUNC(T_SEC/60/60),'00')
     ||':'|| TRIM(TO_CHAR(TRUNC((T_SEC - TRUNC(T_SEC/60/60)*60*60)/60),'00'))
     ||':'|| TRIM(TO_CHAR(T_SEC - TRUNC(T_SEC/60/60)*60*60 - TRUNC((T_SEC - TRUNC(T_SEC/60/60)*60*60)/60)*60,'00')) AVG_SEC
FROM TT
;

 

혹시 더 좋은 방법이 있을까요?

이곳 저곳 찾아 봤는데.. 

시간을 뺄수는 있는데.. 더하는건 문제가 있어서...

자문을 구해 봅니다.

 

감사합니다.

 

 

 

 

 

 

by DarkBee [2015.03.31 10:04:49]
WITH TT AS(
            SELECT '01:00:00' T FROM DUAL UNION ALL
            SELECT '02:00:00' T FROM DUAL UNION ALL
            SELECT '03:00:00' T FROM DUAL UNION ALL
            SELECT '04:00:00' T FROM DUAL
)
SELECT AVG ( TO_CHAR ( TO_DATE ( t, 'HH24:MI:SS' ), 'SSSSS' ) ) 
      , TO_CHAR ( TO_DATE ( AVG ( TO_CHAR ( TO_DATE ( t, 'HH24:MI:SS' ), 'SSSSS' ) ), 'SSSSS' ), 'HH24:MI:SS' )
  FROM tt

 


by DarkBee [2015.03.31 10:08:07]

WITH TT AS(
            SELECT '01:00:00' T FROM DUAL UNION ALL
            SELECT '02:00:00' T FROM DUAL UNION ALL
            SELECT '03:00:00' T FROM DUAL UNION ALL
            SELECT '04:00:00' T FROM DUAL
)
SELECT t 
        , TO_CHAR ( TO_DATE ( t, 'SSSSS' ), 'HH24:MI:SS' )
  FROM (
                SELECT AVG ( TO_CHAR ( TO_DATE ( t, 'HH24:MI:SS' ), 'SSSSS' ) ) t
                  FROM tt
)


by 창조의날개 [2015.03.31 10:20:04]

제가 너무 어렵게 생각했군요..

역시 자문을 구하길 잘했네요..

감사합니다..


by 마농 [2015.03.31 10:25:02]

AVG 한걸 바로 TO_DATE 하면 수수점 때문에 에러날 수 있습니다.

ROUND, FLOOR, TRUNC 등을 이용해 정수로 바꾸어 처리하셔야 합니다.


by 창조의날개 [2015.03.31 10:44:09]

역시 마농님의 꼼꼼하게 챙겨 주시는

예외 사항 처리도 감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입