database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 38616 게시물 읽기
No. 38616
오라클 셀렉트 쿼리 질문드릴께요
작성자
진현철(raper45rpm)
작성일
2011-06-20 10:27ⓒ
2011-06-20 10:30ⓜ
조회수
5,340

안녕하세요,,,오라클 시작하는 초보인데요

 

쿼리 질문좀 드리겠습니다 일단 쿼리는

 

Select b.APPROVER_ROLE,A.DOC_ID,A.TITLE,B.DEPT_NAME , B.USER_NAME , B.SERIAL_ORDER ,
b.APPROVER_ROLE,
D.DOC_STATUS,
nvl ( TO_CHAR(B.SIGN_DATE,'YYYY-MM-DD'), '미결재') etime,
TO_CHAR(SYSDATE,'YYYYMMDD') may,
F.SYSMAIL
from GW_USER.TGW_PROC_DOC A, GW_USER.TGW_PROC_APPROVER B, GW_USER.TGW_PROC_DOC C, GW_USER.TGW_PROC_APPRLINE D,ORGDBADM.TCN_USERINFORMATION_BASIC F
where A.DOC_ID=B.DOC_ID
and A.DOC_ID=C.DOC_ID 
and A.DOC_ID=D.DOC_ID
and B.USER_ID=F.USER_UID
AND TO_DATE(D.DRAFT_DATE,'YYYY-MM-DD') BETWEEN TO_DATE(SYSDATE-30,'YYYY-MM-DD') AND TO_DATE(SYSDATE+30, 'YYYY-MM-DD')
AND TO_DATE(SYSDATE,'YYYY-MM-DD') -TO_DATE(D.DRAFT_DATE,'YYYY-MM-DD') >=3
AND  D.DOC_STATUS ='3'
AND  B.APPROVER_ROLE ='5'
order by B.USER_NAME

 

쿼리는 이렇게 짯는데요,,,내용이 결재 문서중에,,,D.DRAFT_DATE(기안일자) 가  SYSDATE와 비교해서 3일이 지난 문서를

 

셀렉트 해오는 건데요,,,여기서 제가 하고싶은것은,,토요일/ 일요일, 공휴일 같이 쉬는날은 저 웨어 조건에서 빼고 3일 지난 문서를 셀렉트 해오고 싶습니다

 

왜냐하면  토요일/ 일요일, 공휴일 같이 쉬는날 전에

 

즉 금요일날 결재를 올려놓고 퇴근하고 월요일날 되보면 토요일/일요일에는 쉬는 날이니

 

 AND TO_DATE(SYSDATE,'YYYY-MM-DD') -TO_DATE(D.DRAFT_DATE,'YYYY-MM-DD') >=3 

 

이 조건으로 봤을때는 3일이 지났으니 셀렉트가 됩니다,,

 

제가 하고싶은것은 쉬느날은 저 where 조건

 

AND TO_DATE(SYSDATE,'YYYY-MM-DD') -TO_DATE(D.DRAFT_DATE,'YYYY-MM-DD') >=3

 

 에서  제외 하고싶은데,,,, 토요일 일요일만 체크하라고 한다고하면

 

AND TO_DATE(SYSDATE,'YYYY-MM-DD') -TO_DATE(D.DRAFT_DATE,'YYYY-MM-DD') >= DECODE(to_char(D.DRAFT_DATE,'d'),6,5,5,4,3) 

 

이런식으로 목요일에 올린 결재는 4일, 금요일에 올린 결재는 5일 나머지는 3일로 셀렉트 해오게 하면 되겠는데

 

평일에 휴일인 공휴일은 어떡해 해야할지 도저히 감이 안잡힙니다.

 

인터넷을 찾아보니 휴일 테이블을 만들어서 날짜를 빼라고하는데,,,,이게 제가 머리가 나빠서인지 이해가 안가는데,,

 

혹시 다른 방법이 있거나,, 이방법을좀 설명해 주실수 있나요?

 

날씨가 많이 더운데 고생하시고,,,좋은하루 보내세요~

이 글에 대한 댓글이 총 5건 있습니다.

모든 날짜가 저장되어 있는 달력테이블을 구성합니다.
날짜컬럼(pk), 휴일여부(Y/N)
(날짜컬럼 + 휴일여부) 로 구성된 인덱스를 사용한다면 더욱 좋습니다.


 WHERE d.draft_date
    >= (SELECT /*+ INDEX_DESC(달력테이블 pk_달력테이블) */ MIN(날짜컬럼)
          FROM 달력테이블
         WHERE 날짜컬럼 <= TO_CHAR(sysdate, 'yyyy-mm-dd')
           AND 휴일여부 = 'N'
           AND ROWNUM <= 4
        )

마농(manon94)님이 2011-06-20 13:35에 작성한 댓글입니다.

미농님 답변 감사합니다~~

말씀하신거면 일단 휴일테이블을 만들라는 말씀이시잖아요,,

 

그럼 휴일만입력해놓으면 안되는건가요? 예를 들어 3/01,  5/05, 6/06 이런식으로 공휴일만 입력해

 

놓으면 안되는거죠? 1년치 달력을 다입력하고 평일인경우는 N 으로하고 휴일일 경우 Y로 하란 말씀이시

죠?

그리고 이부분

 

 >= (SELECT /*+ INDEX_DESC(달력테이블 pk_달력테이블) */ MIN(날짜컬럼)
 

에서요,,,만약 휴일 테이블이 test 이고 날짜 컬럼이 day , 휴일 여부가 day_yn 라고한다면,,,

 

 

 

 

Select b.APPROVER_ROLE,A.DOC_ID,A.TITLE,B.DEPT_NAME , B.USER_NAME , B.SERIAL_ORDER ,
b.APPROVER_ROLE,
D.DOC_STATUS,
nvl ( TO_CHAR(B.SIGN_DATE,'YYYY-MM-DD'), '미결재') etime,
TO_CHAR(SYSDATE,'YYYYMMDD') may,
F.SYSMAIL
from GW_USER.TGW_PROC_DOC A, GW_USER.TGW_PROC_APPROVER B, GW_USER.TGW_PROC_DOC C, GW_USER.TGW_PROC_APPRLINE D,ORGDBADM.TCN_USERINFORMATION_BASIC F
where A.DOC_ID=B.DOC_ID
and A.DOC_ID=C.DOC_ID 
and A.DOC_ID=D.DOC_ID
and B.USER_ID=F.USER_UID
AND TO_DATE(D.DRAFT_DATE,'YYYY-MM-DD') BETWEEN TO_DATE(SYSDATE-30,'YYYY-MM-DD') AND TO_DATE(SYSDATE+30, 'YYYY-MM-DD')
 

and d.draft_date
    >= (SELECT min(day) FROM test
         WHERE day<= TO_CHAR(sysdate, 'yyyy-mm-dd')
           AND  day_yn= 'N'
           AND ROWNUM <= 4
        )

AND  D.DOC_STATUS ='3'
AND  B.APPROVER_ROLE ='5'
order by B.USER_NAME

 

이렇게 하면 되는건가요? 답변 정말 감사드립니다 

진현철님이 2011-06-20 14:22에 작성한 댓글입니다.
이 댓글은 2011-06-20 14:40에 마지막으로 수정되었습니다. Edit

[모든 날짜가 저장되어 있는] 이라고 이미 언급했구요.

제일 중요한것은 인덱스 역순으로 읽어야 하는 것입니다.

힌트부분(/*+ INDEX_DESC(달력테이블 pk_달력테이블) */)이 빠지면 허당이죠.

마농(manon94)님이 2011-06-20 15:31에 작성한 댓글입니다.
이 댓글은 2011-06-20 15:32에 마지막으로 수정되었습니다.

아 답변 감사합니다,,, 이거 말씀시는거죠?

 

 WHERE d.draft_date
    >= (SELECT /*+ INDEX_DESC(test pk_test) */ MIN(day)
          FROM test 
         WHERE day<= TO_CHAR(sysdate, 'yyyy-mm-dd')
           AND 휴일여부 = 'N'
           AND ROWNUM <= 4
        )

 

 

 

인터넷으로 인덱스 부분을 찾아서 공부해봐야 될꺼같아요,,,,답변 감사드립니다!

진현철님이 2011-06-20 16:49에 작성한 댓글입니다. Edit

pk_test 부분에 인덱스명이 정확하게 들어가야 합니다.

서브쿼리만 따로 떼어 실행해보시고 결과 및 실행계획 확인해 보세요.

마농(manon94)님이 2011-06-20 17:16에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
38619캐릭터셋 변경 [1]
질문
2011-06-20
3424
38618값이 안나왔을때, 임의의 값을 찍는법? [3]
sql초보
2011-06-20
4538
38617쿼리질문이요 ㅠㅠ [3]
궁금타
2011-06-20
3328
38616오라클 셀렉트 쿼리 질문드릴께요 [5]
진현철
2011-06-20
5340
38615쿼리문의 [1]
레이첼
2011-06-16
2969
38614function 문의 [2]
김홍찬
2011-06-16
3171
38613오라클 세로 테이블 가로로 만드는 방법중 [1]
이찬호
2011-06-16
4566
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다