매월 첫번째 월요일에만 작업이 돌아야 하는 경우가 생겼다..


오라클 SQL에서 매월 첫번째 월요일을 구하는 방법을 알아보자..


일단 

TRUNC(date,char) SYSDATE를 년,월,날  기준으로 잘라버린다..

NEXT_DAY(date,char) 함수는 date로부터 그 다음주 char로 명시한 요일을 출력한다.


이 두함수를 이용해서 날을 구해보았다..


SELECT  TRUNC(SYSDATE,'MONTH') FROM DUAL

UNION ALL

SELECT  TRUNC(SYSDATE,'MONTH')-1 FROM DUAL

UNION ALL

SELECT NEXT_DAY((TRUNC(SYSDATE,'MONTH')-1),'월') FROM DUAL


결과는..

2014/03/01 00:00:00

2014/02/28 00:00:00

2014/03/03 00:00:00


TRUNC함수를 이용해서 당월 1일을 구하고

-1을 해서 전월 마지막 날을 구한후에

NEXT_DAY함수를 이용해서 다음주 월요일을 구하면 당월 첫번째 월요일을 구할 수 있다.

Posted by 무세1
,

오라클 TRUNC 함수..

sql 2014. 3. 17. 19:41

TRUNC 함수는..  

원하는 소수점 자리 만큼만 보여주거나..

또는 날짜의 경우도 잘라 버린다..


아래 SQL을 실행하면...

SELECT  SYSDATE

        , TRUNC(SYSDATE) 

        , TRUNC(SYSDATE,'YEAR')

        , TRUNC(SYSDATE,'MONTH')

        , TRUNC(SYSDATE,'DAY')

        , TRUNC(12543.345,2)

        , TRUNC(12543.345,1)

        , TRUNC(12543.345)

FROM DUAL


결과는..  

2014/03/17 19:38:40

2014/03/17 00:00:00

2014/01/01 00:00:00

2014/03/01 00:00:00

2014/03/16 00:00:00

12543.34

12543.3

12543



'sql' 카테고리의 다른 글

SQL문에서 like 검색.. escape  (0) 2014.03.19
매월 첫번주 월요일 구하기...  (0) 2014.03.17
oracle 분석함수 RANK, DENSE_RANK, ROW_NUMBER 차이..  (0) 2014.03.17
오라클 그룹 함수 over, partition by  (2) 2014.03.14
Join 유형  (0) 2014.03.07
Posted by 무세1
,

오라클함수중에..  랭킹을 메기는 함수를 비교..

굳이 설명 필요없이..  결과를 보면 알수 있다..


부서코드 '30'의 연봉랭킹을 구하는 SQL

with emp  as (

select '7782' EMPNO, 'CLARK' ENAME  , 2450 SAL  ,'10' DEPTNO from dual union all

select '7839', 'KING'    , 5000   ,'10' from dual union all

select '7934', 'MILLER'  , 1300   ,'10' from dual union all

select '7566', 'JONES'   , 2975   ,'20' from dual union all

select '7902', 'FORD'    , 3000   ,'20' from dual union all

select '7876', 'ADAMS'   , 1100   ,'20' from dual union all

select '7369', 'SMITH'   , 800    ,'20' from dual union all

select '7788', 'SCOTT'   , 3000   ,'20' from dual union all

select '7521', 'WARD'    , 1250   ,'30' from dual union all

select '7844', 'TURNER'  , 1500   ,'30' from dual union all

select '7499', 'ALLEN'   , 1600   ,'30' from dual union all

select '7900', 'JAMES'   , 950    ,'30' from dual union all

select '7698', 'BLAKE'   , 2850   ,'30' from dual union all

select '7654', 'MARTIN'  , 1250   ,'30' from dual 

)

SELECT  EMPNO

        , ENAME

        , A.DEPTNO

        , RANK() OVER ( ORDER BY SAL DESC)         RNK

        , DENSE_RANK() OVER ( ORDER BY SAL DESC)   D_RNK

        , ROW_NUMBER() OVER ( ORDER BY SAL DESC)   R_RNK

FROM    EMP A

WHERE   DEPTNO = '30'


결과는...

EMPNO   ENAME   DEPTNO  RNK     D_RNK   R_RNK

7698         BLAKE 30    1           1           1

7499         ALLEN 30    2           2           2

7844         TURNER 30    3           3           3

7654         MARTIN 30    4           4           4

7521         WARD 30    4           4           5

7900         JAMES 30    6           5           6



PARTITION BY 를 이용해서 부서별의 연봉랭킹을 구하는 SQL

SELECT  EMPNO

        , ENAME

        , DEPTNO

        , RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC)         RNK

        , DENSE_RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC)   D_RNK

        , ROW_NUMBER() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC)   R_RNK

FROM    EMP


결과는...

EMPNO   ENAME   DEPTNO  RNK     D_RNK   R_RNK

7839         KING         10         1 1 1

7782         CLARK 10         2 2 2

7934         MILLER 10         3 3 3

7902         FORD 20         1 1 1

7788         SCOTT 20         1 1 2

7566         JONES 20         3 2 3

7876         ADAMS 20         4 3 4

7369         SMITH 20         5 4 5

7698         BLAKE 30         1 1 1

7499         ALLEN 30         2 2 2

7844         TURNER 30         3 3 3

7521         WARD 30         4 4 4

7654         MARTIN 30         4 4 5

7900         JAMES 30         6 5 6


'sql' 카테고리의 다른 글

매월 첫번주 월요일 구하기...  (0) 2014.03.17
오라클 TRUNC 함수..  (0) 2014.03.17
오라클 그룹 함수 over, partition by  (2) 2014.03.14
Join 유형  (0) 2014.03.07
row의 최소값, 최대값을 구하는 함수 GREATEST, LEAST  (0) 2014.03.07
Posted by 무세1
,