trunc 함수.. 함 보세요 진짜 희한합니다.. 0 8 6,044

by 손님 TRUNC MOD TO_CHAR [2009.12.03 23:28:41]


오라클 사용하시면 아래 쿼리 한번 실행해 보세요

희한한 것이... 일단 실행해 보시고..

 

with temp as(

    select to_date(’2009/11/06 12:12:13’, ’yyyy/mm/dd hh:mi:ss’) as date_1,

           to_date(’2009/11/05 11:11:13’, ’yyyy/mm/dd hh:mi:ss’) as date_2

      from dual    

)

select mod(mod(hour, 24), trunc(mod(hour, 24))) * 60 ,  -------------------------> 1번 

         trunc( mod(mod(hour, 24), trunc(mod(hour, 24))) * 60, 0) , ----------------> 2번

         trunc( 1, 0) -------------------------------------------------------------> 3번

  from (select abs((date_1 - date_2) * 24) as hour            -- 시간

          from temp )

 

1번의 값은 1입니다

2번은 1의 값을 trunc 한 것입니다 근데 0 이라는 결과가 나옵니다

2번과 3번은 따지면 같은 내용인데 같은 결과가 나와야 하지 않나요?????????????????????????

3번은 1이라는 값이 나오는데 왜 2번은 0이 나올까요?????????????????????????????

이유를 아시는 분 좀 알려주세요~~~~ ^^

by 마농 [2009.12.04 07:52:48]
눈에 보이는 것이 다 그대로는 아닙니다.

WITH temp AS
(
SELECT TO_DATE('2009/11/06 12:12:13', 'yyyy/mm/dd hh:mi:ss') date_1
, TO_DATE('2009/11/05 11:11:13', 'yyyy/mm/dd hh:mi:ss') date_2
FROM dual
)
SELECT hour v
, MOD(hour, 24) v
, TRUNC(MOD(hour, 24)) v
, MOD(MOD(hour, 24), TRUNC(MOD(hour, 24))) v
, MOD(MOD(hour, 24), TRUNC(MOD(hour, 24))) * 60 v
, TO_CHAR(MOD(MOD(hour, 24), TRUNC(MOD(hour, 24))) * 60) v
, TRUNC( MOD(MOD(hour, 24), TRUNC(MOD(hour, 24))) * 60, 0) v
, TRUNC( 1, 0) v
, TRUNC( .9999999999999999999999999999999999984, 0) v
FROM (SELECT ABS((date_1 - date_2) * 24) AS hour
FROM temp)
;

by 손님 [2009.12.04 09:18:32]
마농님 무엇을 말씀하시는 것인지
저도 일일이 찍어봤습니다..
자릿수 차이를 말씀하시는 것인가요?
그건 여기서 그렇게 중요하지 않은거 같은데요
왜 1이 0으로 나오는건지 설명을 좀.. 부탁드려요~

by 마농 [2009.12.04 09:22:39]
1로 보이는듯 하지만 실제로는 1이 아니라는 말입니다.
실제 값은 0.9999999999999999999999999999999999984 입니다.
너무 길어서 그냥 근사치인 1을 보여주고 있을 뿐입니다.

by 마농 [2009.12.04 09:31:27]
, MOD(MOD(hour, 24), TRUNC(MOD(hour, 24))) * 60 v
이계산식의 값을 조회하면 1이 나오지만
이 계산식을 to_char로 감싸보면 다른 값임을 확인 할 수 있습니다.
, TO_CHAR(MOD(MOD(hour, 24), TRUNC(MOD(hour, 24))) * 60) v

by 손님 [2009.12.04 09:34:46]
음.. ^^
그러면 저럴경우 어떻게 해야 되는지요?,...
몇일 몇시간 몇분 몇초 차이인지를 구할려고 하는건데요
분명 언뜻보기에 수치상으로는 1분차이인데...
그리구.. 저렇게 보인다는 것은 정확한 계산을 하는데 문제가 있지 않나요...
저런 계산식 처리할때면 어떻게 처리해야 가장 좋은 방법인지요?...

by 마농 [2009.12.04 09:43:51]
WITH temp AS
(
SELECT TO_DATE('2009/11/06 12:12:13', 'yyyy/mm/dd hh:mi:ss') date_1
, TO_DATE('2009/11/05 11:11:13', 'yyyy/mm/dd hh:mi:ss') date_2
FROM dual
)
SELECT date_1
, date_2
, TRUNC(sssss /(24*60*60)) day
, TO_CHAR(TO_DATE(MOD(sssss,24*60*60),'sssss'),'hh24:mi:ss') "hh24:mi:ss"
FROM
(
SELECT date_1
, date_2
, ROUND(ABS(date_1 - date_2) * 24 * 60 * 60) sssss
FROM temp
)
;

날짜 계산한 결과를 역산할 경우 정수로 정확하게 떨어지지 않아 에러가 발생하는 경우가 종종 있습니다.
round 처리를 한번 해주셔야 합니다.

by 손님 [2009.12.04 09:47:18]
아~~
감사합니다 ^^

by finecomp [2009.12.04 13:22:33]
date에 3초 더하는 것은...;
date + 3/(24*60*60) 또는 date + 3/86400 입니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입