728x90

이번 포스팅은 [그림 1]과 같이 기간을 사용할 때 중복으로 등록할 수 없게 체크하는 방법에대해 포스팅 해보고자 합니다.

 

이 방법은 구현하는데 엄청나게 많은 고민 끝에 생각해낸 방법인데 너무 복잡하게 짜여진 구조가 아닌가 생각이 듭니다.

혹시 더 좋은 방법 있으신 분은 공유 부탁드립니다.

 

그림 1


우선 조건은 이렇습니다.

 

1. 시작날짜만 입력한 경우 [ ex) 20200619 이후 ]

2. 종료날짜만 입력한 경우 [ ex) 20200619 이전 ]

3. 둘다 입력한 경우 [ ex) 20200601 ~ 20200619 ]

ㅡㅡ 1번 조건인 경우 종료날짜는 99991231로 넣어주고, 2번 조건은 10000101 값으로 넣어줍니다. ㅡㅡ


위 조건의 1번과 2번의 경우 현재 등록된 최소값과 최대값을 구한 후 등록된 값이 넘지는 않는지 체크해주면 됩니다.

 

Query ex) SELECT MIN(시작날짜) AS C
                       MAX(종료날짜) AS D
              FROM 테이블명
             WHERE 식별컬럼 = ?   // 물음표는 등록할 값입니다.


등록된 데이터 예시

이제 조건문을 통해 등록하려는 날짜가 등록된 최소,최대값 밖에 위치하는지 체크를 합니다.

 

if( MIN > 등록할 시작날짜 && MAX < 등록할 종료날짜) {

 1번 쿼리 실행

} else {

 2번 쿼리 실행

}


1번 Query)

              SELECT COUNT(1)
               FROM 테이블명
              WHERE 식별컬럼 = ?
                  AND 시작날짜컬럼명 >= ?{시작}
                  AND 종료날짜컬럼명 <= ?{종료}

 

2번 Query)

            SELECT COUNT(1)
               FROM 테이블명
              WHERE 식별컬럼 = ? 
                 AND ((시작날짜 <= ?{시작} AND 종료날짜>= ?{시작}) OR (시작날짜<= ?{종료} AND 종료날짜>= ?{종료}))

 


1번 쿼리에 경우 둘다 입력한 경우인 3번조건인 경우 중복체크하는 쿼리입니다.

2번 쿼리에 경우 둘중 하나만 입력한 경우인 1,2번 조건을 중복체크하는 쿼리입니다.

 

여기까지 읽어주셔서 감사합니다.

728x90
TOP