2010-04-26 4 views
2

본 사이트에 광고 예약 시스템을 쓰고 있습니다. 광고는 StartDateEndDate 필드로 예약되어 온라인 상태를 나타냅니다.MySQL : 충돌하는 날짜 범위가있는 행 찾기

새로운 광고를 추가 할 때 새 광고가 동일한 위치에 예약 된 기존 광고와 충돌하지 않도록 빠른 유효성 검사가 있습니다.

은 내가이 쿼리와 함께 줄 알았는데 :

SELECT * 
FROM adverts 
WHERE EndDate >= '2010-04-22' 
AND StartDate < '2010-04-22' 

2010년 4월 22일 내가 예약하려는 새 고라의 StartDate입니다. StartDate이 2010-04-26이고 EndDate이 2010-05-09 인 예약 된 광고가 있습니다. 종료


  • 시도가 기존 광고 후에 시작하는 광고를 예약하기 : 0을 반환 행 (올바른)

  • 는 다른 날짜로 조회 결과입니다 기존 광고의 기간 동안 시작 및 끝나는 광고 예약하기 : 1 행 (올바른)을 반환합니다.

  • (210)
  • 는 광고 시작을 예약하려고 끝나는 기존 광고가 시작하기 전에 : 0 행 (올바른) 반환 기존 광고는 기존 광고의 날짜 도중 시작하고, 지속적인 전에 시작하는 광고를 예약 할

  • 시도 (! 잘못된) 범위 : : 전에 시작하여 현재 광고 종료 후 종료 광고 예약 (잘못된)

  • 시도 반환 0 행 0 행 수익을


누구나이 쿼리를 다시 작성하는 방법에 대한 아이디어가 없으므로 날짜 범위의 충돌 만 고려할 수 있습니까?

감사합니다, 매트

답변

6
SELECT * 
    FROM adverts 
WHERE `EndDate` >= :AdStartDate 
    AND `StartDate` <= :AdEndDate 

나는 시작 및 종료 날짜가 나는 규칙이 그것에 대해 무엇을 알고하지 않기 때문에, 동일한 가장자리 케이스를 차지하지 않았습니다.

+0

이것은 솔루션처럼 보입니다. 나는 맹세코 먼저 논리를 헷갈 렸습니다. 감사! 시작일/종료일에 대한 내 규칙은 동일하지만이 코드는 어쨌든이 경우를 충족합니다. 꼭 1 행을 반환합니다. 고맙습니다! –