출근 insert를 할 때, 결근
으로 표기되고 퇴근 update 시간에 따라 status를 정상출근
, 지각
, 조퇴
로 표기되도록 쿼리문을 작성하였다.
insert의 AT_DATE 처리는 to_date, to_char로 하다가 trunc를 사용하여 처리하는 것으로 변경하였다.
INSERT INTO ATTENDANCE (AT_DATE, E_NO, AT_START, AT_STATUS)
VALUES (to_date(to_char(sysdate, 'YYYY-MM-DD'), 'YYYY-MM-DD'), '202402_00000036', sysdate, '결근');
INSERT INTO ATTENDANCE (AT_DATE, E_NO, AT_START, AT_STATUS)
VALUES (trunc(sysdate), '202402_00000036', sysdate, '결근');
update ATTENDANCE
set AT_END = sysdate,
AT_STATUS = case
when to_char(sysdate, 'HH24:MI') between '07:00' and '18:00' then '정상출근'
when to_char(sysdate, 'HH24:MI') between '09:11' and '24:00' then '지각'
when (sysdate - ATTENDANCE.AT_START) * 24 >= 4 and (sysdate - ATTENDANCE.AT_START) * 24 < 8 then '조퇴'
else '기타'
end
where AT_DATE = trunc(sysdate) -- 오늘 날짜에 대한 레코드를 해야 근태 기록 확인, 수정 가능
and E_NO = '202402_00000036' -- 해당 사원의 레코드
and AT_START is not null; -- 출근한 경우에만 퇴근 기록 가능
바인드 변수로 쿼리문을 실행하니
[22019][911] ORA-00911: invalid character Position: 571
에러가 발생하였다.
출근하지 않은 사람들의 근태를 관리하고자 한다면 and AT_START is not null;
을 제거해야 정상적으로 update가 되었다. 그래서 아래와 같이 쿼리문을 수정하였다.
update ATTENDANCE
set AT_END = sysdate,
AT_STATUS = case
when to_char(sysdate, 'HH24:MI') between '06:00' and '19:00' then '정상출근'
when to_char(sysdate, 'HH24:MI') between '09:11' and '24:00' then '지각'
when (sysdate - ATTENDANCE.AT_START) * 24 >= 4 and (sysdate - ATTENDANCE.AT_START) * 24 < 8 then '조퇴'
else '기타'
end
where AT_DATE = trunc(sysdate) -- 오늘 날짜에 대한 레코드를 해야 근태 기록 확인, 수정 가능
and E_NO = :x; -- 해당 사원의 레코드
수정1) 의 쿼리문으로 테스트를 해보니 오전 9시 22분에 출근하고 오전 10시 30분에 퇴근을 해도 정상출근
으로 AT_STATUS가 표기되었다.
또한, 정상출근 조건을 상세하게 추가해도 오전 10시 40분에 출근하고 오전 11시에 퇴근을 해도 결근
이 아닌 지각
으로 AT_STATUS가 표기되었다.
이를 해결하기 위해 정상출근
과 지각
의 조건을 추가하였다.
<update id="atUpdate" parameterType="map">
update ATTENDANCE
set AT_END = sysdate,
AT_STATUS = case
when to_char(sysdate, 'HH24:MI') between '04:00' and '23:59'
and to_char(sysdate, 'HH24:MI') < '09:11'
and to_char(sysdate, 'HH24:MI') > '17:59'
then '정상출근'
when to_char(sysdate, 'HH24:MI') between '09:11' and '24:00'
and to_char(sysdate, 'HH24:MI') > '17:59'
then '지각'
when (sysdate - ATTENDANCE.AT_START) * 24 >= 4 and (sysdate - ATTENDANCE.AT_START) * 24 < 8 then '조퇴'
else '결근'
end
where AT_DATE = trunc(sysdate)
and E_NO = #{E_NO}
</update>
<정상출근>
오전 4시부터 오후 11시 59분까지 출근버튼과 퇴근버튼을 눌렀을 때 정상출근
처리가 되는데 9시 11분 이전(즉, 오전 9시 10분) ~ 오후 5시 59 이후(즉, 오후 6시)의 시간 사이에는 출근, 퇴근이 찍히지 않아야 한다는 것을 조건으로 추가하였다.
<지각>
오전 9시 11분에 출근버튼을 찍으면 무조건 지각
처리가 되는데 오후 5시 59분 이후(즉, 오후 6시)에 퇴근을 찍어야 지각으로 처리되고 그 이전에 찍으면 결근
처리 되도록 쿼리문을 추가하였다.
아래 쿼리문은 이미 status가 입력되어 있는 상태에서 관리자가 status만 변경하는 쿼리문이다. 기존 출근, 퇴근 버튼을 누른 시간은 남겨두고 AT_STATUS, MOD_DATE, MOD_ID를 update하여 근태 상태를 변경하고 이를 변경한 날짜가 변경한 사람에 대한 정보를 남겨두고자 하였다.
-- 관리자가 기존 근태 상태를 update (기존 출,퇴근 찍힌 시간은 유지한 채 AT_STATUS만 바뀌도록...)
update ATTENDANCE
set MOD_DATE = sysdate,
MOD_ID = '이응수,
AT_STATUS = '조퇴'
where AT_DATE = trunc(sysdate)
and E_NO = '202402_00000036';
바인드 변수)
UPDATE ATTENDANCE
set MOD_DATE = sysdate,
MOD_ID = :x,
AT_STATUS = :status
WHERE AT_DATE = trunc(sysdate)
AND E_NO = :y;