728x90
반응형

이번 포스팅은 TRUNC함수를 이용한 소수점, 날자 형식 짜르기에 대한 내용입니다.

 

TRUNC 함수는 숫자의 소숫점을 절삭할때 사용을 하는데 

날짜 형식의 날짜, 시간 이후의 값을 절삭 할때도 유용하게 사용될수 있습니다.

 

 

SELECT

TRUNC(203.12347)

,TRUNC(203.12347,5)

,TRUNC(203.12347,4)

,TRUNC(203.12347,3)

,TRUNC(203.12347,2)

,TRUNC(203.12347,1)

FROM DUAL;

 

1. 형식 : TRUNC(숫자, 소숫점절삭위치)

2. TRUNC 함수에 소숫점절삭위치를 생략하면 소숫점을 전부 잘라 버립니다.

3. TRUNC 함수에 소숫점절삭위치를 지정하면 지정한 위치 이후의 자리를 절삭합니다.

  

  

 

SELECT

IN_END_DT

,TRUNC(IN_END_DT,'YYYY')

,TRUNC(IN_END_DT,'MM')

,TRUNC(IN_END_DT,'HH24')

,TRUNC(IN_END_DT,'MI')

,TRUNC(IN_END_DT,'DD')

FROM (SELECT TO_DATE('20130405082510','YYYYMMDDHH24MISS') AS IN_END_DT FROM DUAL);

 

1.  TRUNC(날짜,절삭위치)

2. 절삭위치 날짜 관련 파라미터 값

 1) YYYY : 년도를 제외한 부분을 절삭합니다. 월은 01로, 일은 1로, 시분초 는 00 으로 설정합니다.

 2) MM :  년, 월을 제외한 부분을 절삭합니다. 일은 1로, 시분초 는 00 으로 설정합니다.

 3) DD : 년, 월,일을 제외한 부분을 절삭합니다.  시분초 는 00 으로 설정합니다.

 4) HH24 : 분, 초를 00으로 절삭합니다.

 5) MI : 초를 00으로 절삭합니다.

  

 

 

SELECT

IN_FR_DT,IN_END_DT

, ROUND((IN_END_DT - IN_FR_DT)*24)+1

FROM (SELECT TO_DATE('20130405082510','YYYYMMDDHH24MISS') AS IN_FR_DT,

TO_DATE('20130405134510','YYYYMMDDHH24MISS') AS IN_END_DT

FROM DUAL)

 

 시작 시간에서 끝 시간을 시간 단위로 쪼개는 쿼리를 만들어 보려고 합니다.

2013-04-05 08:25:10 ~ 2013-04-05 13:45:10 사이의 시간차는 6시간 이며, 시간 간격을 행으로 만들어 보려고 합니다.

 

  

 

SELECT

IN_FR_DT,IN_END_DT

, IN_FR_DT+(LEVEL-1)/24 AS N_IN_FR_DT

, IN_FR_DT+(LEVEL)/24 N_IN_END_DT

, LEVEL AS NO

FROM (SELECT TO_DATE('20130405082510','YYYYMMDDHH24MISS') AS IN_FR_DT,

TO_DATE('20130405134510','YYYYMMDDHH24MISS') AS IN_END_DT

FROM DUAL)

CONNECT BY LEVEL <= ROUND((IN_END_DT - IN_FR_DT)*24)+1;

 

 CONNECT BY LEVEL <= ROUND((IN_END_DT - IN_FR_DT)*24)+1 함수를 이용하여 시간차를 구하고 +1을 하여 6이라는 시간차를 구했고

 CONNECT BY LEVEL <= 6

한시간 간격으로 6행을 만들었어요

  

 

 

SELECT

IN_FR_DT,IN_END_DT

, DECODE(LEVEL,1,IN_FR_DT, IN_FR_DT+(LEVEL-1)/24) AS N_IN_FR_DT

, DECODE(LEVEL,ROUND((IN_END_DT - IN_FR_DT)*24)+1,IN_END_DT,IN_FR_DT+(LEVEL)/24) N_IN_END_DT

, LEVEL AS NO

FROM (SELECT TO_DATE('20130405082510','YYYYMMDDHH24MISS') AS IN_FR_DT,

TO_DATE('20130405134510','YYYYMMDDHH24MISS') AS IN_END_DT

FROM DUAL)

CONNECT BY LEVEL <= ROUND((IN_END_DT - IN_FR_DT)*24)+1;

 

첫번째 시작 시간, 마지막 종료시간의 분을 DECODE를 이요하여 설정하였습니다.

첫 행의 시작 시간은 입력시간으로, 마지막 행의 완료시간은 입력한 완료시간으로 설정하였어요.

  

 

SELECT

IN_FR_DT,IN_END_DT

, DECODE(LEVEL,1,IN_FR_DT, TRUNC(IN_FR_DT+(LEVEL-1)/24,'HH24')) AS N_IN_FR_DT

, DECODE(LEVEL,ROUND((IN_END_DT - IN_FR_DT)*24)+1,IN_END_DT,TRUNC(IN_FR_DT+(LEVEL)/24,'HH24')) N_IN_END_DT

, LEVEL AS NO

FROM (SELECT TO_DATE('20130405082510','YYYYMMDDHH24MISS') AS IN_FR_DT,

TO_DATE('20130405134510','YYYYMMDDHH24MISS') AS IN_END_DT

FROM DUAL)

CONNECT BY LEVEL <= ROUND((IN_END_DT - IN_FR_DT)*24)+1

 

 첫행의 시작 시간, 마지막 행의 완료시간을 제외한 시간값을 TRUNC(값,'HH24')을 해서 분,초를 '00'으로 만들어어요

 

 

 

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,