특정기간(해당월의 주) 동안 연장근무(YEON_TOT)가 12시간 초과 되는 사람을 찾는 쿼리입니다.
보통 1주일을 일요일~토요일 로 계산을 하는데, 월~일요일로 계산을 해달라고 하네요..
그리고 토~일요일은 특근시간(TUK_TIME) 을 연장시간과 합해서 계산이 되게 해달라고 하네요..
어떤식으로 변경을 하면 될까요??
SELECT TO_CHAR(TO_DATE(A.DATE,'YY/MM/DD'),'IYIW'),
A.SABEON,
SUM(A.YEON_TOT),
A.NAME,
B.SAEOPNM,
B.DEPTNM,
B.DEPTNM1
FROM insa B,
MONTH A
WHERE B.SABEON = A.SABEON
AND SUBSTR(A.DATE,1,6) = '201806'
AND B.GIBONGU BETWEEN '2' AND '4'
and Substrb(TO_CHAR(TO_DATE(A.DATE,'YY/MM/DD'),'D'),1,2) between '1' and '7'
AND A.CODE IN ('00','02','05')
GROUP BY TO_CHAR(TO_DATE(A.DATE,'YY/MM/DD'),'IYIW'),A.SABEON,A.NAME,B.SAEOPNM,B.DEPTNM,B.DEPTNM1
HAVING SUM(A.YEON_TOT) > 12
ORDER BY A.SABEON
○ 연장근무시간에 특근시간을 더하려면
- 굳이 요일을 체크할 필요가 있는지 의문이네요?
- 변경전 : SUM(a.yeon_tot)
- 변경후 : SUM(a.yeon_tot + a.tuk_time)
- 굳이 요일을 체크한다면.
- SUM(a.yeon_tot + CASE WHEN TO_CHAR(TO_DATE(a.date, 'yyyymmdd'), 'd') IN ('1','7') THEN a.tuk_time ELSE 0 END)
○ 기타 쿼리에서 비효율적인 부분들 개선
1. 컬럼을 가공하여 조건형식에 맞추지 마시고, 조건을 가공하여 컬럼형식에 맞추세요.
- 변경전 : SUBSTR(a.date, 1, 6) = '201806'
- 변경후 : a.date LIKE '201806%'
2. 날짜 변환시 실제 포멧에 맞게 정확하게 포멧을 적어주세요.
- 변경전 : TO_DATE(a.date, 'yy/mm/dd')
- 변경후 : TO_DATE(a.date, 'yyyymmdd')
3. 무의미한 조건은 빼주시구요.
- Substrb(TO_CHAR(TO_DATE(A.DATE,'YY/MM/DD'),'D'),1,2) between '1' and '7'
SELECT TO_CHAR(TO_DATE(a.date, 'yyyymmdd'), 'iyiw') iyiw , a.sabeon , SUM(a.yeon_tot + a.tuk_time) tot_time , a.name , b.saeopnm , b.deptnm , b.deptnm1 FROM insa b , month a WHERE b.sabeon = a.sabeon AND a.date LIKE '201806%' AND b.gibongu BETWEEN '2' AND '4' AND a.code IN ('00', '02', '05') GROUP BY TO_CHAR(TO_DATE(a.date, 'yyyymmdd'), 'iyiw') , a.sabeon, a.name, b.saeopnm, b.deptnm, b.deptnm1 HAVING SUM(a.yeon_tot + a.tuk_time) > 12 ORDER BY a.sabeon ;