기존 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, @시작일자,@종료일자)
이렇게 하면 기간 사이에 요일은 구할수 있던데
시작과 종료 사이에 딱 체크 되도록 하는게 어렵습니다 도와주세요.
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 ;