날짜 + 숫자 ==> 날짜보다 숫자만큼 일 수 이후의 날짜
날짜 - 숫자 ==> 날짜보다 숫자만큼 일 수 이전의 날짜
날짜 - 날짜 ==> 두 날짜 의 일 수 차이
날짜 + 날짜 ==> 연산 불가
SYSDATE
ADD_MONTHS( )
MONTHS_BETWEEN( )
NEXT_DAY( ), LAST_DAY( )
select sysdate as now, //==>22/08/04
sysdate-1 as yesterday, //==> 22/08/03
sysdate+1 as tomorrow //==> 22/08/05
from dual;
ex)
select sysdate,
round(sysdate, 'ddd') as format_ddd, //지정일의 정오를 기준으로 반올림해서 시간은버리고 날짜 출력 , 정오 전이면 지정일 출력.
round(sysdate, 'hh') as format_hh // 지정일 기준 현재 시각으로 30분이 넘으면시간을 올려서 분단위 버리고 시간까지 출력.
from dual;
select sysdate, trunc(sysdate, 'ddd') as format_ddd, //지정일의 시간은 버리고 날짜만 출력 , 정오 전이면 지정일 전날 출력.
trunc(sysdate, 'hh') as format_hh //지정일 기준 현재의 시간에서 분단위 버리고 시간까지 출력.
from dual;
!!!!!! 년도까지 포함한 모든 날짜와 시간 조회
select to_char(sysdate,'YYYY/MM/DD HH24:MI:SS')
from dual;
ex)
select sysdate, add_months(sysdate,3) //22/11/04
from dual;
select empno, ename, hiredate, add_months(hiredate, 120) // 입사일기준 120개월(10년후 ) 날짜출력.
as work10years from emp;
select empno, ename, hiredate,sysdate from emp
where add_months(hiredate, 480)< sysdate; //입사일 기준 (480개월)40년 후가 오늘보다 전인 직원출력.
= 입사 40주년이 이미 지난 사람.
ex)
select empno, ename, hiredate, sysdate,
months_between(hiredate,sysdate) as month1, // -123.45
months_between(sysdate,hiredate) as month2, // 123.45
trunc( months_between(sysdate,hiredate)) as month3 // 123 : 일수 버리고 개월수만 출력 (만 ○개월)
from emp;
ex)
select sysdate,
next_day(sysdate,'월요일'), //22/08/08 : 오늘기준 다음에 오는 월요일의 날짜
last_day(sysdate) //22/08/31 : 오늘이 포함된 달의 마지막 날짜.
from dual;
select empno, ename, empno+500
from emp
where ename='SCOTT';
|| ==> 같은 결과 (자동 형변환= 암시적 형 변환)
select empno, ename, empno+'500' ' ' 로 묶은 문자형 숫자도 숫자로 인식해서 계산해줌.
from emp
where ename='SCOTT';
select 'ABCD'+empno, ename, empno+500 ==> 계산되지 않음. 문자 +숫자
from emp 사용자가 직접 형을 변경하는 명시적 형 변환을 해서 계산해줘함.
where ename='SCOTT';
TO_CHAR( ) : 숫자 또는 날짜를 문자로 변환.
TO_NUMBER( ) :문자를 숫자로 변환.
TO_DATE( ) : 문자를 데이터로 변환.
숫자==>문자==>날짜
날짜==>문자==>숫자 : 문자데이터를 중심으로 숫자나 날짜는 문자로 바꿨다가 변환해줘야함.
TO_CHAR( 날짜나 숫자', '바꿀형식')
ex) AS현재 날짜 시간
select to_char(sysdate,'YYYY/MM/DD HH24:MI:SS')
from dual;
ex) 오전과 오후시간 나눠서 보기
select to_char(sysdate,'YYYY/MM/DD HH24:MI:SS'),
to_char(sysdate,'YYYY/MM/DD HH12:MI:SS A.M.'),
to_char(sysdate,'YYYY/MM/DD HH:MI:SS P.M.')
from dual;
ex)
select sysdate, to_char(sysdate,'MM') as mm //월 :01,02,10,11....
to_char(sysdate, 'MON') as mon
to_char(sysdate, 'MONTH') as month // 8월
to_char(sysdate,'DD') as dd // 일 :03, 15, 27...
to_char(sysdate, 'DY') as dy // 월, 화, 수, 목...
to_char(sysdate, 'DAY') as day // 월요일, 금요일,수요일 ...
!!!! NLS_DATE_LANGUAGE= 언어 로 출력되는언어를 지정해줄 수 있다.
ex)
select sysdate, to_char(sysdate,'MM') as mm,
to_char(sysdate, 'MON','nls_date_language = korean') as mon, //8월
to_char(sysdate, 'MONTH','nls_date_language = japanese') as month, //8月
to_char(sysdate,'DD') as dd,
to_char(sysdate, 'DY') as dy,
to_char(sysdate, 'DAY','nls_date_language = english') as day //FRIDAY
from dual;
!!!!!여러가지 숫자 출력 형식
ex)
select to_char (sal,'$999,999,999'),
to_char (sal,'L999,999,999'),
to_char (sal,'000,999,999.00'),
to_char (sal,'000999.00999'),
to_char (sal,'999,999,00'),
문자를 숫자로 변환하는 TO_NUMBER함수
: 문자열 varchar2나 date 형식의 데이터를 숫자로 바꾸지는 못하지만 '숫자'로 이루어진 데이터는 숫자로 읽고 자동 형변환 가능.
: 문자 (글자나 기호) 가 포함된 데이터는 읽지 못함.
ex)
'1,300'과 '1,500' 더하기
select '1300'+1500
1300+'1500' //둘다 2800 : 숫자로 자동 형변환.
from dual;
select to_number('1,300','999,999') +to_number('1,500','999,999')
//, 때문에 숫자로 읽지 못해 형변환 후 계산.
from dual;
ex)
select to_date('2022-08-05','YYYY-MM-DD'), //2022-08-05
to_date('20220805','YYYY-MM-DD') //2022-08-05
from dual;
select *from emp
where hiredate >to_date('1981/06/01','YYYY-MM-DD');
: 데이터가 NULL 이면 산술연산자나 비교연산자가 동작 하지 않아서
NULL을 다른값으로 변환해주어야한다.
NVL( )
NVL2( )
1.데이터의 값이 NULL일때 값을 지정해주는 NVL함수
ex)
select empno,ename, sal,comm, sal+comm, //comm이 null 값을 가지면 0으로 출력.
nvl(comm,0), sal+nvl(comm,0)
from emp;
ex)
select empno, ename, comm,
nvl2(comm,'O','X'),nvl2(comm,sal*12+comm,sal*12)
from emp;
if~ else if 와 비슷한 방식으로 접근
DECODE( )
CASE( )
ex) 직급별로 급여 인상률이 다를때
select empno,ename,job, sal,
DECODE(job,'MANAGER',sal*1.1,
'SALESMAN',sal*1.05,
'ANASYST',sal,
sal*1.03) as 인상급여
from emp;
ex) 직급별로 급여 인상률이 다를때
select empno,ename,job, sal,
CASE job when 'MANAGER' then sal*1.1
when 'SALESMAN' then sal*1.05
when 'ANASYST' then sal else sal*1.03 end as 인상급여
from emp;
ex) 상여금의 여부가 다를 때
select empno,ename,comm,
CASE when comm is null then '해당사항 없음'
when comm =0 then '수당 없음'
when comm >0 then '수당:'||comm
end as comm_text