*.날짜함수
1 select sysdate, sysdate-1, sysdate+1, to_char(sysdate+(1/2),'yy-mm-dd hh24:mi')
2* from dual
3 /
SYSDATE SYSDATE- SYSDATE+ TO_CHAR(SYSDAT
-------- -------- -------- --------------
09/06/26 09/06/25 09/06/27 09-06-26 21:37
*.months_between : 날짜와 날짜사이의 개월을 계산
1 select sysdate,months_between(sysdate,to_date('2009-01-01'))
2 from emp
3* where empno=7788
SQL> /
SYSDATE MONTHS_BETWEEN(SYSDATE,TO_DATE('2009-01-01'))
-------- ---------------------------------------------
09/06/26 5.82029757
*.add_months : 날짜에 개월을 더한 날짜 계산.
1 select sysdate,add_months(sysdate,2)
2 from emp
3* where empno=7788
SQL> /
SYSDATE ADD_MONT
-------- --------
09/06/26 09/08/26
*.last_day : 해당월의 마지막일
*.next_day : 다가오는 요일의 날짜를 반환.
1 select sysdate, last_day(sysdate), next_day(sysdate,'토')
2 from emp
3* where empno=7788
SQL> /
SYSDATE LAST_DAY NEXT_DAY
-------- -------- --------
09/06/26 09/06/30 09/06/27
*.round/trunc : 적용될 날짜형태받아서 하위에서 반올림/절삭
1 select sysdate, round(sysdate,'mm'), trunc(sysdate,'dd')
2 from emp
3* where empno=7788
SQL> /
SYSDATE ROUND(SY TRUNC(SY
-------- -------- --------
09/06/26 09/07/01 09/06/26
1 select sysdate, to_char(round(sysdate,'hh'),'yy/mm/dd HH24:mi:ss'), trunc(sysdate,'hh')
2 from emp
3* where empno=7788
SQL>
SQL> /
SYSDATE TO_CHAR(ROUND(SYS TRUNC(SY
-------- ----------------- --------
09/06/26 09/06/26 11:00:00 09/06/26
1 select sysdate, to_char(sysdate,'ddd'), to_char(sysdate,'dd'), to_char(sysdate,'d')
2 from emp
3* where empno=7788
SQL> /
SYSDATE TO_ TO T
-------- --- -- -
09/06/26 177 26 6
*.Null관련 함수
- nvl(exp1, exp2) : 첫인수가 null이면 두번째인수로 대체
- nvl2(exp1, exp2, exp3) : 첫인수가 null가 아니면 두번째 인수대체, null이면 세번째 인수대체
1 select comm, nvl(comm, 90), nvl2(comm,999,90)
2 from emp
3* where sal >= 1500
SQL> /
COMM NVL(COMM,90) NVL2(COMM,999,90)
---------- ------------ -----------------
300 300 999
90 90
90 90
90 90
90 90
90 90
0 0 999
90 90
- nullif : 함수 두개의 표현식을 비교해 동일하면 null, 일치하지않으면 첫번째값 반환.
nullif(exp1, exp2)
SQL> select comm, nullif(comm, 0)
2 from emp
3 where comm is not null
4 ;
COMM NULLIF(COMM,0)
---------- --------------
300 300
500 500
1400 1400
0
- coalesce : 인수중의 null아닌 첫번째 인수 반환. 없으면 null.
1 select comm, coalesce(comm, 77)
2* from emp
SQL> /
COMM COALESCE(COMM,77)
---------- -----------------
77
300 300
500 500
77
*.decode 함수 : if~case 알고리즘 간단한표현, 연산자는 '='만 가능. 불만족시 null반환.
decode(표현식|컬럼명, 찾는값1, 리턴값1, 찾는값2,리턴값2, [default값])
1 select ename, sal, decode(ename, 'ALLEN', sal)
2* from emp
SQL> /
ENAME SAL DECODE(ENAME,'ALLEN',SAL)
---------- ---------- -------------------------
SMITH 800
ALLEN 1600 1600
WARD 1250
JONES 2975
MARTIN 1250
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
TURNER 1500
ADAMS 1100
SQL> -- 10번 부서 급여 100 추가
SQL> -- 20번 부서 급여 200추가
SQL> -- 그외 9000 일괄 지급
1 select ename, deptno, decode
2 (
3 deptno, 10, sal+100,
4 20, sal+200,
5 9000
6 )
7* from emp
SQL> /
ENAME DEPTNO DECODE(DEPTNO,10,SAL+100,20,SAL+200,9000)
---------- ---------- -----------------------------------------
SMITH 20 1000
ALLEN 30 9000
WARD 30 9000
JONES 20 3175
MARTIN 30 9000
BLAKE 30 9000
CLARK 10 2550
SCOTT 20 3200
KING 10 5100
TURNER 30 9000
ADAMS 20 1300
*.case 함수
decode함수기능 확장, 산술연산, 관계연산, 논리연산 비교가능.
case [표현식] when 조건 then 조건만속시 실행코드
else 이후 불만족시 코드.
end
SQL> --급여가 1300이하이면 '급여올려주삼'
SQL> --1300초과하면서 2999이하이면 '나도 올려줘'
SQL> --2999초과 4000이하 '희망~!'
SQL> --그 외 '나두~~'
1 select ename, sal,
2 case when sal<1300 then '급여올려주삼'
3 when sal>=1300 and sal<=2999 then '나도 올려줘'
4 when sal<4000 then '희망!'
5 else '나두~~'
6 end
7* from emp
SQL> /
ENAME SAL CASEWHENSAL<
---------- ---------- ------------
SMITH 800 급여올려주삼
ALLEN 1600 나도 올려줘
WARD 1250 급여올려주삼
JONES 2975 나도 올려줘
MARTIN 1250 급여올려주삼
BLAKE 2850 나도 올려줘
CLARK 2450 나도 올려줘
SCOTT 3000 희망!
KING 5000 나두~~
===============
1. 사원명, 급여 "한달급여", "일당" 구하기 / 한달 20일근무
select ename, sal, sal/20
from emp
2. 사원명,입사일,입사한 달의 근무일수 출력(날마다 근무)
select ename, hiredate, last_day(hiredate)-hiredate
from emp
3. 우리 과정 개강한지 오늘로 몇일?
select sysdate-to_date('2009-05-25','yyyy-mm-dd')
from dual