2012-02-09 3 views
1

sdate (ShowDate) 및 hdate (HideDate)이있는 storeID에 할당 된 일정에 특정 이벤트가 있습니다. 이제이 storeID가있는 모든 새로운 이벤트에 대해 기존 기간과 겹치는 부분이 없는지 확인해야합니다. 말이 돼? 어떻게해야합니까? 나는 물건에 대해 읽었지만 "겹치지 않는 경우에만 삽입하는"방법을 알아낼 수 없었습니다. 는 범위의 시작과 끝 값으로 S1..E1 S2..E2과 두 범위를 가지고 있다면, 만약 중첩이 일반적중복되는 날짜 범위 생성 금지

+0

StackOverflow에 오신 것을 환영합니다. 무슨 "달력"? 어떤 언어? 어떤 데이터베이스? 지금까지 뭐 해봤 어? 여기에 우리가 당신을 도우려는 데 사용할 수있는 어떠한 정보도 제공하지 않습니다. 질문을 수정하고 자세한 내용을 입력하십시오. 네가 그렇게하지 않으면 나는 두려워한다.이 질문은 "진짜 질문이 아니다"로 끝날 것이다. –

+0

죄송합니다, PHP 및 MySql - 나는 둘 사이에 놀아 보았습니다. 그러나 실제로 갈 수 없었습니다. 또한 PHP에서 사용할 수 있습니까? – cerr

답변

3

, 같은 경우

  • S1 < E2 및
  • S2 < E1은

이 좋은 (그리고 안심)는 대칭이다. '작게'운영이 '작거나 같아야'하는지 여부를 신중하게 결정해야합니다. 둘 다 데이터를 저장하는 방법 (열린 대 닫힌 대 또는 반 개방 또는 개방 폐쇄 및 폐쇄 개방 범위 등)에 따라 둘 다 이해할 수 있습니다. 'Determine whether two date ranges overlap'에 대한 가능성이 diagram 인 것을 볼 수 있습니다.

컨텍스트에서 'ShowDate'는 시작 날짜에 해당하고 'HideDate'는 종료 날짜에 해당합니다.

마치 'conditional insert'을 수행하려는 것처럼 들립니다. 이 경우, 당신을 StoreID 1001이라고 가정하고 showdate와는 2012-03-21하고 HideDate은 다음 작성할 수 있습니다, 2012-03-28입니다 : 선택 목록에서

INSERT INTO Calendar(StoreID, ShowDate, HideDate, ...) 
    SELECT 1001, '2012-03-21', '2012-03-28', ... 
    FROM Dual 
    WHERE NOT EXISTS(SELECT * FROM Calendar C2 
         WHERE C2.StoreID = 1001 
         AND C2.ShowDate < '2012-03-28' 
         AND '2012-03-21' < C2.HideDate 
        ); 

값은 그입니다 Calendar 테이블에 추가하려고합니다. 하위 선택은 새 값에 대한 데이터와 함께 0 행 (중복이 있으므로) 또는 1 행 (중복이 없기 때문에)을 얻는다는 것을 의미합니다.

+0

튜플'(1001, '2012-03-21', '2012-03-28', ...) '대신'SELECT ... FROM DUAL'이 필요한 이유는 무엇입니까? – Air

+0

SQL의 방언 (또는 DBMS가 준수하는 표준). 일부 DBMS는 표기법을 지원하지 않습니다. –