[Project] 근태 - 출근 insert, 퇴근 update, 관리자 update 쿼리문

이슬기·2024년 2월 18일
0

project

목록 보기
34/42

출근 insert를 할 때, 결근으로 표기되고 퇴근 update 시간에 따라 status를 정상출근, 지각, 조퇴로 표기되도록 쿼리문을 작성하였다.

👇 insert 출근

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 퇴근

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; -- 출근한 경우에만 퇴근 기록 가능

수정1)

바인드 변수로 쿼리문을 실행하니

[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; -- 해당 사원의 레코드

수정2)

수정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') &lt; '09:11'
                                 and to_char(sysdate, 'HH24:MI') &gt; '17:59'
                            then '정상출근'
                        when to_char(sysdate, 'HH24:MI') between '09:11' and '24:00'
                                 and to_char(sysdate, 'HH24:MI') &gt; '17:59'
                             then '지각'
                        when (sysdate - ATTENDANCE.AT_START) * 24 &gt;= 4 and (sysdate - ATTENDANCE.AT_START) * 24 &lt; 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시)에 퇴근을 찍어야 지각으로 처리되고 그 이전에 찍으면 결근 처리 되도록 쿼리문을 추가하였다.

👇 관리자 update

아래 쿼리문은 이미 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;

0개의 댓글

관련 채용 정보