흐르는 시간의 블로그...

아래의 쿼리는 전체 사용 쿼리중 일부이다.

복잡해 보이는 TRUNC 쿼리는 설정한 데이터의 STARTTIME과 ENDTIME의 시각부분만을 사용하기 위해서 진행한 부분이다.


실질적인 복합 쿼리는 그 하단부이다.

DAYOFWEEK 필드에 요일의 값이 비트마스킹 되어 들어 있다. 

7BIT를 사용한다. 

최대값은 127이다.


어제 날짜의 요일값을 구하고 그것을 숫자로 변환한다.

그것을 2의 배수로 제곱하여 DAYOFWEEK 필드와 AND를 진행하면 해당 요일 비트에 설정된 값이라면 BITAND의 결과인 DAYOFWEEKBIT 값이 0이 아니게 되며 만약 설정된 값이 없다면 BITAND결과로 "0"이 발생한다



SELECT CARNO,
                  TRUNC (SYSDATE) + (STARTTIME - TRUNC (STARTTIME)) - 1 AS ST,
                  TRUNC (SYSDATE) + (ENDTIME - TRUNC (ENDTIME)) - 1 AS ET
             FROM (SELECT CARNO,
                          STARTTIME,
                          ENDTIME,
                          BITAND (DAYOFWEEK,POWER (2,TO_NUMBER (TO_CHAR (SYSDATE - 1, 'D')) - 1)) AS DAYOFWEEKBIT
                     FROM UBIKHANS.TBL_OFFDUTY_CONFIG
                    WHERE OVERNIGHT = 1) 

WHERE DAYOFWEEKBIT <> 0



'프로그래밍??? > 오라클' 카테고리의 다른 글

Pro*C에서 Dynamic SQL에서 bind변수 사용하기  (0) 2017.08.24
ORA-14196 발생  (0) 2015.10.22
비트 연산 하기  (0) 2015.05.18
날짜에서 요일 찾기  (0) 2015.05.18
Oracle Sequence value are not ordered  (0) 2015.04.03