months_between(기준날짜1, 기준날짜2)
'기준날짜1'이 '기준날짜2'보다 더 현재에 가까운 날짜여야 함
오늘 날짜를 출력하는 방법
SELECT sysdate
FROM dual;
EX) 이름과 입사한 날자부터 오늘까지 총 몇 달을 근무했는지 출력
SELECT ename, months_between(sysdate,hiredate)
FROM emp;
SELECT round(months_between(sysdate,'2000/02/17'))
FROM dual;
add_months(기준날짜, 구하고 싶은 기간)
EX) 2019년 5월 1일부터 100달 뒤의 날짜는 어떻게 되는지 출력
SELECT add_months('2019/05/01',100)
FROM dual;
next_day(기준날짜, 구하고 싶은 요일)
예제) '2021/05/05'로 부터 바로 돌아오는 월요일의 날짜가 어떻게 되는지 출력
SELECT next_day('2021/05/05','월요일')
FROM dual;
last_day(기준날짜)
오늘부터 이번달 말일까지 총 몇일 남았는지 출력하시오
SELECT last_day(sysdate)-sysdate
FROM dual;
to_char(컬럼명 또는 "변경 전 데이터","변경 후 나타내고 싶은 형태")
날짜형 --> 문자형
숫자형 --> 문자형
SELECT ename, to_char(hiredate,'day'), to_char(sal,'999,999')
FROM emp
WHERE ename='SCOTT';
to_char(날짜 컬럼명, '날짜 포맷')
날짜 포맷 :
년도 - RRRR, YYYY, RR, YY
달 : MON,MM
일 : DD
요일 : DAY,DY
to_char(숫자 칼럼명, '정규 표현식')
$ : 달러 표시 (ex. $999,999 -> $ 3,000)
L : 원화 표시 (ex. L999,999 -> \ 3,000)
예제, 수요일에 입사한 사원들의 이름과 입사일과 입사한 요일을 출력하세요
SELECT ename, hiredate, to_char(hiredate,'day')
FROM emp
WHERE to_char(hiredate, 'day') = '수요일' ;
예제, 특정 날짜의 요일이 무엇인지 출력하시오
SELECT to_char(to_date('2011/02/04/','RRRR/MM/DD'),'day')
FROM dual;
*현재 세션의 날짜 형식을 확인하는 방법
(세션 : 내가 지금 접속한 창)
SELECT *
FROM nls_session_parameters;
*현재 세션의 날짜 형식을 DD/MM/RR로 변경
ALTER SESSION SET nls_date_format = '원하는 형식'
ALTER SESSION SET nls_date_format = 'DD/MM/RR';
SELECT ename, hiredate
FROM emp
WHERE hiredate = '81/11/17'; -- 현제 세션의 날짜 형식과 다르므로, 해당 조건문 쿼리는 더이상 적용이 안된다..
SELECT ename, hiredate
FROM emp
WHERE hiredate = to_date('81/11/17','RR/MM/DD'); -- 현재 세션의 날짜 형식이 어떻게 되어있든간에, 문제가 없음
WHERE hiredate = to_date('날짜','작성한 날짜의 형식');
EX) 1981년도에 입사한 사원들의 이름과 입사일을 출력하는데 최근에 입사한 사원부터 출력하세요
-- 내가 작성한 답안
select ename, hiredate
from emp
where to_char(hiredate,'YYYY') = '1981'
order by hiredate desc;
-- 선생님이 작성하신 답안
select ename, hiredate
from emp
where hiredate between to_date('1981/01/01','RRRR/MM/DD')
AND to_date('1981/12/31','RRRR/MM/DD') + 1 -- 오전 0시 까지를 의미하므로 +1
order by hiredate desc;
ORACLE DB에서 조건절의 데이터를 확인 후 자동으로 형 변환을 시행
숫자의 우선순위가 높아서, 문자를 숫자로 바꿔버린다
SELECT ename, sal
FROM emp
WHERE sal = '3000';
-- 숫자와 문자의 비교로, 원래라면 실행이 되지 않아야 함, 하지만 암시적 형변환으로
아래와 같이 실행함
where sal = 3000;
-- 암시적 형변환은 성능을 안 좋게 할 수 있기 때문에 되도록이면 데이터 형에 맞는 조건 명시하도록
explain plan for
SELECT ename, sal
FROM emp
WHERE sal = '3000';
select * from table(dbms_xplan.display);
explain plan for {SQL문} FROM TABLE(dbms_xplan.display)
SELECT ename, sal
FROM emp
WHERE sal like '30%';
-- 숫자와 문자의 비교로, 여기서는 문자로 명시된 부분을 모두 숫자로 바꿀 수 없기에 (%), sal 칼럼을 암시적으로 문자로 변환함
where to_char("sal") like '30%';
-- like를 조건문에서 많이 사용할 것 같으면 처음에 테이블 설계부터, sal 컬럼을 문자형으로 만들어야 함.