본문 바로가기

오라클

오라클 날짜 표현

-- 국가 통화 날짜 등 여러가지 출력 형식 확인하는 쿼리

SELECT parameter, value FROM NLS_SESSION_PARAMETERS;

-- 국가 설정 변경

ALTER SESSION SET NLS_LANGGUAGE = 'KOREAN';

-- 통화기호 변경

ALTER SESSION SET NLS_CURRENCY = '\';


-- 기본적인 날짜 출력 형식 : RR/MM/DD

SELECT SYSDATE FROM DUAL;

=> 13/05/30

--날짜형식 변경 

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';

ALTER SESSION SET NLS_DATE_FORMAT = 'RR/MM/DD';

-- SYSDATE : 컴퓨터 시스템의 현재 날짜를 반환

-- CURRENT_DATE : 현재 SESSION의 날짜 정보 확인

SELECT SYSDATE, CURRENT_DATE FROM DUAL;


-- 날짜와 날짜를 빼면 일수가 계산되어 나온다.

SELECT TRUNC(SYSDATE - TO_DATE('2000-01-01','YYYY-MM-DD'))

        FROM DUAL;

=> 4898 (출력한날 기준)


--RR: 1900년도를 기준으로 이전 50년도에서 이후 49년까지를 기준 년도로 하여 가까운 1850~1946년도까지의 값을 표현하고 , 이 범위를 벗어날 경우 2000년을 기준으로 이전 50년도에서 이후 29년 까지 출력 YY는 시스템 날짜를 기준으로 한다.

SELECT name, TO_DATE(SUBSTR(ssn,1,6), 'YYMMDD'),

TO_DATE(SUBSTR(ssn,1,6),'RRMMDD') FROM insa;

=> 똑같은 결과가 출력되어 보인다. 하지만 아래와 같이 변환해서 보면 차이를 알 수 있다.

SELECT name, TO_CHAR(TO_DATE(SUBSTR(ssn, 1,6), 'YYMMDD'),'YYYY-MM-DD'),

               TO_CHAR(TO_DATE(SUBSTR(ssn, 1,6), 'RRMMDD'),'YYYY-MM-DD') FROM insa;

=> 위에서 첫번쨰 필드는 년도가 20XX으로 찍혀서 나오지만 2번째 필드는 19XX으로 나온다.


-- ADD_MONTHS(d,n) : 해당 날짜에  n만큼의 달수를 더한다.

SELECT SYSDATE,ADD_MONTHS(SYSDATE,5)FROM DUAL;

=> 13/10/30 처럼 출력하는날 기준으로 5달만큼 더해서 출력


-- LAST_DAY(d) : 해당월의 마지막일이 몇일인지 확인

SELECT SYSDATE,LAST_DAY(SYSDATE)FROM DUAL;

=> 13/05/31 처럼 마지막날 표시


-- MONTHS_BETWEEN(d1,d2) : 두달째 사이의 차이(d1-d2)를 월로 돌려줌
SELECT TRUNC(MONTHS_BETWEEN(SYSDATE,TO_DATE('2000-01-01','YYYY-MM-DD'))/12) age
FROM DUAL;
=> 2000-01-01을 날짜로 바꾸고(TO_DATE) SYSDATE와 2000-01-01의 차이를 월로 계산하여(MONTHS_BETWEEN) 12로 나눠줌으로 두 날짜사이의 차이를 년도로 표시해준다.

-- TRUNC(d, [,fmt]): 정해진 날짜를 fmt를 기준으로 내림(월은 7월 1일 기준)
-- ROUND(d,[,fmt]) : 정해진 날짜를 fmt를 기준으로 반올림(월은 7월 1일 기준)
SELECT
    TRUNC(TO_DATE('2004/08/24','YYYY/MM/DD'), 'YEAR') ,
    TRUNC(TO_DATE('2004/06/24','YYYY/MM/DD'), 'YEAR') ,
    ROUND(TO_DATE('2004/08/24','YYYY/MM/DD'), 'YEAR') ,
    ROUND(TO_DATE('2004/06/24','YYYY/MM/DD'), 'YEAR')
    FROM DUAL;
=> 1,2번쨰는 2004/01/01로 출력, 3번째 필드는 2005/01/01, 4번째 필드는 2004/01/01

--NEXT_DAY(d, char) : 명시된 요일이 돌아오는 날짜 계산(요일은 숫자로 가능. 일요일 : 1 ~ 토요일 : 7)
SELECT SYSDATE, NEXT_DAY(SYSDATE,'금요일') FROM DUAL;
SELECT SYSDATE, NEXT_DAY(SYSDATE,6) FROM DUAL;
=> 둘다 오늘 기준으로 돌아오는 금요일 출력
-- 주의 시작과 끝
SELECT SYSDATE,
    CASE
        WHEN TO_CHAR(SYSDATE, 'DAY') = '일요일' 
  THEN SYSDATE                              -- WHEN 오늘이 일요일이면 THEN 그대로 찍고 아니면 ELSE 지나간 최근 일요일 계산해서 찍어라.
        ELSE NEXT_DAY(SYSDATE, 1) - 7    --NEXT_DAY(SYSDATE,1) 가 명시된 요일인 일요일이 돌아오는 날을 계산함. 여기서 7일을 뺴주면 지나간 최근 일요일이 찍힌다.                                      
        END 주시작,
    CASE
        WHEN TO_CHAR(SYSDATE,'DAY') = '토요일' 
  THEN SYSDATE
        ELSE NEXT_DAY(SYSDATE, 7)
        END 주끝
FROM DUAL;

-- EXTRACT() : 날짜에서 원하는 날짜 영역 추출
SELECT EXTRACT(YEAR FROM SYSDATE)
 ,EXTRACT(MONTH FROM SYSDATE)
 ,EXTRACT(DAY FROM SYSDATE) 
FROM DUAL;
=>  필드마다 년도와 월,일이 따로 추출되서 출력

-- 날짜에 산술 연산을 사용하는 경우
  -- 날짜 + 숫자 -> 날짜 : 날짜에 일수를 더함
  -- 날짜 - 숫자 -> 날짜 : 날짜에 일수를 뺌
  -- 날짜 + 숫자/24 -> 날짜 : 날짜에 시간을 더함
  -- 날짜 - 날짜 -> 날짜에서 날짜를 뺀 일 수 계산
SELECT SYSDATE, SYSDATE + 20, SYSDATE -30,
  SYSDATE -TO_DATE('2000-01-01', 'YYYYMMDD') FROM DUAL;