*.날짜함수

  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


Posted by 말없제이
,