< 날짜 처리 함수 >
* SYSDATE
시스템 날짜 및 시간 반환 (현재 날짜 및 시간)
SELECT SYSDATE FROM DUAL;
* MONTHS_BETWEEN(DATE1, DATE2)
두 날짜 사이의 개월 수 => 내부적으로 DATE1 - DATE2 후 나누기 30, 31 이 진행될꺼임
=> 결과값은 NUMBER 타입
SELECT EMP_NAME, HIRE_DATE, FLOOR(SYSDATE - HIRE_DATE) || '일' AS "근무일수",
CEIL(MONTHS_BETWEEN (SYSDATE, HIRE_DATE)) || '개월' AS "근무개월수"
FROM EMPLOYEE;
* ADD_MONTHS(DATE, NUMBER)
특정날짜에 해당 숫자만큼의 개월 수를 더해서 날짜를 리턴
=> 결과값 : DATE 타입
SELECT ADD_MONTHS(SYSDATE, 6) FROM DUAL;
-- EMPLOYEE 에서 사원명, 입사일, 입사후 6개월이 된 날짜 조회
SELECT EMP_NAME, HIRE_DATE, ADD_MONTHS(HIRE_DATE, 6)
FROM EMPLOYEE;
* NEXT_DAY(DATE, 요일)
특정 날짜 이후에 가까운 해당 요일의 날짜를 반환해주는 함수
=> 결과값은 DATE 타입
SELECT SYSDATE, NEXT_DAY(SYSDATE, '금요일') FROM DUAL;
SELECT SYSDATE, NEXT_DAY(SYSDATE, '금') FROM DUAL;
-- 1. 일요일, 2. 월요일, ...
SELECT SYSDATE, NEXT_DAY(SYSDATE, 6) FROM DUAL;
SELECT SYSDATE, NEXT_DAY(SYSDATE, 'FRIDAY') FROM DUAL; -- 현재 언어가 KOREAN이기 때문에 안됨
FRIDAY를 사용하기 위해서는 언어를 변경해줘야한다.
-- 언어 변경
-- 1.언어 조회
SELECT * FROM NLS_SESSION_PARAMETERS;
-- 2. 언어 변경
ALTER SESSION SET NLS_LANGUAGE = AMERICAN;
SELECT SYSDATE, NEXT_DAY(SYSDATE, 'FRIDAY') FROM DUAL; -- 됨
SELECT SYSDATE, NEXT_DAY(SYSDATE, '금') FROM DUAL; -- 안됨
ALTER SESSION SET NLS_LANGUAGE = KOREAN; -- 다시 한국어로 변경
* LAST_DAY(DATE)
해당 월의 마지막 날짜를 구해서 반환
=> 결과값 DATE 타입
SELECT LAST_DAY(SYSDATE) FROM DUAL;
-- EMPLOYEE 에서 사원명, 입사일, 입사한달의 마지막 날짜, 입사한 달에 근무한 일수
SELECT EMP_NAME, HIRE_DATE, LAST_DAY(HIRE_DATE), LAST_DAY(HIRE_DATE) - HIRE_DATE
FROM EMPLOYEE;
* EXTRACT
특정 날짜로부터 년도 | 월 | 일 값을 추출해서 반환하는 함수
EXTRACT (YEAR FROM DATE) : 년도만 추출
EXTRACT (MONTH FROM DATE) : 월만 추출
EXTRACT (DAY FROM DATE) : 일만 추출
=> 결과값은 NUMBER 타입
-- 사원명, 입사년도, 입사월 ,입사일 조회
SELECT EMP_NAME,
EXTRACT(YEAR FROM HIRE_DATE) AS "입사년도",
EXTRACT(MONTH FROM HIRE_DATE) AS "입사월",
EXTRACT(DAY FROM HIRE_DATE) AS "입사일"
FROM EMPLOYEE
ORDER BY "입사년도", "입사월", "입사일";