기간 등록시 중복 체크하는 방법 도와주세요 0 2 808

by freedl [SQLServer] [2017.08.31 15:32:54]


기존 ATable

(요일, 교시, 장소코드) 컬럼이 있습니다.

요일은 월요일은 1, 화요일은 2 ..... 일요일은 7로 관리합니다.

교시는 시간이 아니라 1,2,3.........,12 이렇게 나눠져서 등록 되어있습니다

그리고 새로 등록할때

(시작일자, 종료일자, 시작교시, 종료교시, 장소코드)

이 항목으로 저장하게 되는데

시작일자와 종료일자 사이의 요일에 같은 장소에 데이터가 있다면 저장이 안되도록 체크하고 싶습니다.

 

예를 들어

ATable에

요일 : 2  /   교시: 7  / 장소코드 : 301호

데이터가 있다면

입력시

시작일자 : 2017-08-28/ 시작교시 : 3/ 종료일자 : 2017-08-31/ 종료교시 : 3/ 장소코드 : 301호

입력하게 되면 그사이에 화요일이 포함되기 때문에 등록이 안되어야합니다.

시작일자 : 2017-08-29/ 시작교시 : 8/ 종료일자 : 2017-08-31/ 종료교시 : 3/ 장소코드 : 301호

이라면 등록이 되어야할꺼구요

요일 중복이 문제가 될꺼같아서 시작일자와 종료일자 기간은 7일로 입력 할꺼구요.

 

SELECT CASE DATEPART(dw, CONVERT(VARCHAR, DATEADD(D, NUMBER, @시작일자), 112))
                               When '1' THEN '7'
                               When '2' THEN '1'
                               When '3' THEN '2'
                               When '4' THEN '3'
                               When '5' THEN '4'
                               When '6' THEN '5'
                               When '7' THEN '6'  END AS DayWeek
  FROM MASTER..SPT_VALUES
 WHERE TYPE = 'P'
   AND NUMBER <= DATEDIFF(D, @시작일자,@종료일자)

 

 

이렇게 하면 기간 사이에 요일은 구할수 있던데

시작과 종료 사이에 딱 체크 되도록 하는게 어렵습니다 도와주세요.

 

by 마농 [2017.08.31 15:47:33]

a 테이블에 (일자 또는 기간) 정보가 없는게 이상하네요?
입력할 때 기간정보(시작일~종료일)가 있다면?
a 테이블에도 그런 부분이 반영되어 있어야 할 듯 한데요?


by 마농 [2017.08.31 17:08:49]
SELECT b.dy
     , c.number tm
  FROM (SELECT sdt, stm, edt, etm
             , CONVERT(VARCHAR(10), DATEADD(d, number, sdt), 20) dt
             , DATEPART(dw, DATEADD(d, number-1, sdt)) dy
          FROM (-- input test --
               SELECT '2017-08-28' sdt, 3 stm, '2017-08-31' edt, 3 etm
               --SELECT '2017-08-29' sdt, 8 stm, '2017-08-31' edt, 3 etm
               ) b
         INNER JOIN master..spt_values c
            ON c.type = 'P'
           AND c.number <= DATEDIFF(d, b.sdt, b.edt)
        ) b
 INNER JOIN master..spt_values c
    ON c.type = 'P'
   AND c.number >= CASE WHEN dt = sdt THEN stm ELSE  1 END
   AND c.number <= CASE WHEN dt = edt THEN etm ELSE 12 END
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입