[날짜형 함수]    

☞  ADD_MONTHS 

 

1. 정의 : 지정한 날짜로부터 특정 개월을 더한 날짜를 구함 
2. 사용예)
SELECT  ADD_MONTHS(SYSDATE, 25) FROM DUAL;
     결과) 2010/04/17 17:04:36   
3. 참고 : -(minus)값일 경우  월을 차감한다.

 
   
 
   
☞ SYSDATE
 

1. 정의 : 현재 시스템의 날짜 및 시간을 구함
2. 사용예)
SELECT  SYSDATE FROM DUAL;
     결과) 2008/03/17 16:52:16   

LAST_DAY

 

1. 정의 : 지정한 날짜의 해당 월의 말일을 구함
2. 사용예)
SELECT  LAST_DAY(SYSDATE) FROM DUAL;
     결과) 2008/03/31 16:52:16

☞ NEXT_DAY
 

1. 정의 : 지정한 날짜로부터 가장 가깝게 다가올 해당 요일의 날짜를 구함
2. 기능 : 요일구분 : 1 - 일요일
                     2 - 월요일 ....
                     7 - 토요일
3. 사용예) 
SELECT  NEXT_DAY(TO_DATE('20080317'), 1) FROM DUAL;
     결과) 2008/03/22 00:00:00 

☞ MONTHS_BETWEEN
 

1. 정의 : 두 날짜 상이의 개월 수를 구함
2. 사용예)
SELECT  MONTHS_BETWEEN(TO_DATE('20100505'), SYSDATEFROM DUAL;
     결과) 25.5900....   

☞ 날짜에 대한 요일 구하기
 

1. 정의 : 날짜에 대한 요일 구하기 
2. 사용예)
SELECT  TO_CHAR(SYSDATE, 'DY') FROM DUAL;
     결과) 환경에 따라서 : 월,화,수,~~    일  (한글)
                           MON,THE,WED~~, SUN  (영문)
     * 항상 한글로 원할 경우
           (Oracle속성을 바꿀 수도 있지만 아래와 같이 한 sql에서만 적용시킬수도 있다)
           
SELECT  TO_CHAR(SYSDATE, 'DY', 'NLS_DATE_LANGUAGE=KOREAN') FROM
 DUAL;

   사용예2) SELECT  TO_CHAR(SYSDATE, 'D') FROM DUAL;
       결과) 1,2 ~~ 7;  --숫자로 나옴 (1:일, 2:월, ~~  7:토요일)

☞ 월별 주차 구하기

 

1. 정의 : 해당 월별로 주차(1~6주)를 구한다.
2. 1주를 ->
일 ~ 토 까지 기준일 경우 SQL
   
SELECT '20101205'
     ,
CEIL((substrb('20101205', -2, 2) + 7 - TO_CHAR(TO_DATE('20101205', 'yyyymmdd'), 'D')) / 7) as "주차"
  
FROM DUAL;

3. 1주를 ->
월 ~ 일 까지 기준일 경우 SQL - 종류1 (만약, 매월1일이  일요일이면   02일을 1주로 본다.)
   
SELECT  DECODE(WC, 0, 1, WC)
   
FROM  (
           
SELECT '20081231' DT
                ,
CEIL((substrb('20081231', -2, 2) + 7 - DECODE(TO_CHAR(TO_DATE('20081231', 'yyyymmdd'), 'D'), 1, 1, 0)
                        -
DECODE(TO_CHAR(TO_DATE('20081231','yyyymmdd'),'D'), 1, 7, (TO_CHAR(TO_DATE('20081231','yyyymmdd'),'D')))
                       ) / 7) as WC
             
FROM DUAL
         )
    ;

3. 1주를 ->
월 ~ 일 까지 기준일 경우 SQL - 종류2 (만약, 매월1일이  일요일이면   02일을 1주로 본다.)
                                         - 위 종류1 SQL문장을 좀더 보기 좋게  종류2 SQL 문으로 단순 변화만 시켰음.
  
SELECT CEIL((DD + 7 - SUN- DECODE( YO, 1, 7, YO)) / 7) as WC
  
FROM (
        
SELECT SUBSTR('20090302', -2, 2)                                                                                   AS DD
             ,
DECODE(SUBSTR('20090302', -2, 2), '01', 0, DECODE(TO_CHAR(TO_DATE('20090302', 'yyyymmdd'), 'D'), 1, 1, 0))  AS SUN
             , TO_CHAR(TO_DATE('
20090302', 'yyyymmdd'), 'D')                                                               AS YO
        
FROM   DUAL
       ) ;

3. 1주를 ->
월 ~ 일 까지 기준일 경우 SQL - 종류3  (만약, 매월1일이  일요일이면   02일을 2주로 본다.)
  
SELECT CEIL((DD + 7 + SUN- DECODE( YO, 1, 7, YO)) / 7) as WC
  
FROM (
        
SELECT SUBSTR('20090301', -2, 2)                                                                                    AS DD
             ,
DECODE(SUBSTR('20090301', -2, 2), '01', 0, DECODE(TO_CHAR(TO_DATE('20090301', 'yyyymmdd'), 'D'), 1, -1, 1))  AS SUN
             , TO_CHAR(TO_DATE('
20090301', 'yyyymmdd'), 'D')                                                                AS YO
        
FROM
  DUAL
       ) ;

A. 정의 : 월별  몇주차까지 존재 하는지 조회
   
예문1 : 201012   월에 대해서   몇주차까지 있는지 조회

  
SELECT CEIL((DD + 7 + SUN- DECODE( YO, 1, 7, YO)) / 7) as WC
  
FROM (
        
SELECT SUBSTR(WORKDT, -2, 2)                                                                                AS DD
             ,
DECODE(SUBSTR(WORKDT, -2, 2), '01', 0, DECODE(TO_CHAR(TO_DATE(WORKDT, 'yyyymmdd'), 'D'), 1, -1, 1))  AS SUN
             , T
O_CHAR(TO_DATE(WORKDT, 'yyyymmdd'), 'D')                                                            AS YO
        
FROM   (SELECT TO_CHAR(ADD_MONTHS('201012
' || '01', 1) - 1, 'YYYYMMDD') WORKDT FROM DUAL)
       ) ;
  결과 : 5

   
예문2 : 2010년도 1~12월까지  각월별 주차 구하기

  
SELECT CEIL((DD + 7 + SUN- DECODE( YO, 1, 7, YO)) / 7) as WC
  
FROM (
        
SELECT SUBSTR(WORKDT, -2, 2)                                                                                AS DD
             ,
DECODE(SUBSTR(WORKDT, -2, 2), '01', 0, DECODE(TO_CHAR(TO_DATE(WORKDT, 'yyyymmdd'), 'D'), 1, -1, 1))  AS SUN
             , T
O_CHAR(TO_DATE(WORKDT, 'yyyymmdd'), 'D')                                                            AS YO
        
FROM   (SELECT TO_CHAR(ADD_MONTHS('201012
' || '01', 1) - 1, 'YYYYMMDD') WORKDT
                
FROM DUAL, (SELECT to_char(rownum, '00') rn FROM dual connect by level <= 12)
                )
       ) ;

☞ 년간 주차 구하기

 


1. 정의 : 년간 주차 (1~52주)를 보여준다.

2. 한 날짜에 대한 년간 주차 구하기
  SELECT '20090115' as "날짜"
       , CEIL(  (TO_CHAR(TO_DATE('20090115','yyyymmdd'),'ddd')
              +
TO_CHAR(TO_DATE(SUBSTR('20090115',1,4)||'0101','yyyymmdd'),'d') - 1) / 7)   DDATE
   
FROM dual

3. 2010-12-10 부터 2011-01-15 까지 두 날짜 사이의 년간주차를 구하기

   
SELECT TO_CHAR(TRUNC(TO_DATE('2010-12-10','YYYY-MM-DD') + ((LEVEL-1)*7), 'IW') + 5, 'YYYY')  YYYY
        ,
TO_CHAR(TRUNC(TO_DATE('2010-12-10','YYYY-MM-DD') + ((LEVEL-1)*7), 'IW'), 'IW') WW
        ,
TRUNC(TO_DATE('2010-12-10','YYYY-MM-DD') + ((LEVEL-1)*7), 'IW') - 1  BEGIN_DAY
        ,
TRUNC(TO_DATE('2010-12-10','YYYY-MM-DD') + ((LEVEL-1)*7), 'IW') + 5  END_DAY
    
FROM DUAL
   
CONNECT BY LEVEL <= (  (TRUNC(TO_DATE('2011-01-15','YYYY-MM-DD'), 'IW')+5) -- 검색종료일
                        - (
TRUNC(TO_DATE
('2010-12-10','YYYY-MM-DD'), 'IW')-1) -- 검색시작일
                        + 1
                       ) / 7 + 1 ;

☞ 시간 더하기

 


WITH T(DT) AS
(
               
SELECT SYSDATE - (1/24) * 2    FROM DUAL  --현재시각에서 2시간 전
     
UNION ALL SELECT SYSDATE - (1/24) * 1    FROM DUAL  --현재시각에서 1시간 전
     
UNION ALL SELECT SYSDATE + (1/24) * 0.5  FROM DUAL  --현재시각에서 30분 후
     
UNION ALL SELECT SYSDATE + (1/24) * 1    FROM DUAL  --현재시각에서 1시간
     
UNION ALL SELECT SYSDATE + (1/24) * 2    FROM DUAL  --현재시각에서 2시간 후
     
UNION ALL SELECT SYSDATE + (1/24) * 2.25 FROM DUAL  --현재시각에서 2시간 20분 후
)
SELECT DT
  
FROM T ;
 

SELECT TO_CHAR(SYSDATE, 'YYYYMMDD HH24MISS'               ) C_TIME,   -- 현재시간
       
TO_CHAR(SYSDATE + 1/24,'YYYYMMDD HH24MISS'         ) TIME,     -- 1시간 후
       
TO_CHAR(SYSDATE + 40/(24*60),'YYYYMMDD HH24MISS'   ) MIN,      -- 40분 후
       
TO_CHAR(SYSDATE + 10/(24*60*60),'YYYYMMDD HH24MISS') SEC       -- 10초 후
  
FROM DUAL;


 


☞  
 

 

☞ ROUND  
 

1. 정의 : 날짜에 대한 반올림처리

☞ TRUNC
 

1. 정의 : 날짜에 대한 버림처리 

☞ 
 

 

 

'(DB) Oracle > 함수' 카테고리의 다른 글

Oracle - 그룹 함수  (0) 2017.01.18
Oracle - 변환함수  (0) 2017.01.18
Oracle - 숫자형 함수  (0) 2017.01.18
Oracle - 문자형함수  (0) 2017.01.18
Oracle - 패턴 정규식 함수  (0) 2017.01.18
Posted by 농부지기
,