시간 차 구하기 0 6 802

by Taems [Oracle 기초] 시간 [2018.10.30 08:06:21]


안녕하세요. 쿼리 문의를 드립니다. 아래와 같이 오라클에서 시간 차이 값을 구하려면 어떻게 해야하나요? 작은값에거 큰값을 뺀 후 100으로 나누면 아래 처럼 값이 나오질 않고 다르게 나오는데 조언 부탁 드리겠습니다.

1400 - 1330 = 0.5 
1700 - 1530 = 1.5
1900 - 1800 = 1.0

by 마농 [2018.10.30 09:02:53]
WITH t AS
(
SELECT '1330' stm, '1400' etm FROM dual
UNION ALL SELECT '1530', '1700' FROM dual
UNION ALL SELECT '1800', '1900' FROM dual
)
SELECT stm, etm
     , ROUND(( TO_DATE(etm, 'hh24mi')
             - TO_DATE(stm, 'hh24mi')
             ) * 24, 2) h  -- 날짜 연산 후 시간 환산
     , ROUND( FLOOR(etm/100) + MOD(etm,100)/60
            - FLOOR(stm/100) - MOD(stm,100)/60
            , 2) h -- 수치 연산
  FROM t
;

 


by Taems [2018.10.30 09:32:48]

아...... 이렇게 쿼리 구문을 짤수가 있네요..... 감사합니다. 마농님~ 오늘도 즐거운 하루 되세요~^^


by 우리집아찌 [2018.10.30 09:34:44]
-- TO_NUMBER했더니 약간 잘리는듯..
SELECT TO_NUMBER(TO_DATE('1400','HH24MI') - TO_DATE('1330','HH24MI')) * 24
 FROM DUAL
 

 


by 마농 [2018.10.30 10:05:55]

1. to_number 해서 잘리는게 아니고
  - 소수점 이하 연산을 하다보니 무한소수로 인해 오차가 생기는 거구요. (예 : 0.333333333333333, 0.66666666666666667 등)
  - ROUND 로 오차 보정이 필요합니다.
2. 그리고 날짜 차감 결과는 어차피 number 이므로
  - to_number 는 필요 없는 부분입니다.
  - 오히려 이것 때문에 to_char 가 내부적으로 한번 더 수행이 되요.
  - to_number(1) ==> to_number(to_char(1))


by 우리집아찌 [2018.10.30 10:37:42]

아.. 그렇군요..


by 우리집아찌 [2018.10.30 10:39:26]

 SELECT ROUND(( TO_DATE('1400','HH24MI') - TO_DATE('1330','HH24MI')) * 24 ,3 )
 FROM DUAL
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입