2012-07-16 8 views
1

두 테이블 간의 데이터를 비교하고 충돌이 있는지 확인해야합니다. 이 개 테이블 Events & Bookings에 대한날짜와 시간을 기준으로 한 테이블의 데이터를 다른 테이블과 비교하십시오.

다음

입니다 샘플 데이터가 나는 충돌하는 Date & Time & 쇼 기록을 기반으로 Events 표와 bookings 표를 비교해야합니다.

실제로 이벤트 날짜가 변경되면 & 시간을 변경할 수 있습니다. 특정 날짜에 이미 예약 한 경우 표시 할 보고서를 생성해야합니다. & 시간 슬롯. 나는 우리가 모든 예약이있는 경우 업데이트 된 이벤트

쿼리 쿼리 위

Declare @bTime varchar(10) = '10:30'; 
Declare @bDate date = '2012-08-15'; 
SELECT * FROM EventDatesReporting WHERE 
((CONVERT(time(0), EventStartTime) <= CONVERT(time(0),@bTime) 
    AND CONVERT(time(0), EventEndTime) >= CONVERT(time(0),@bTime)) 
OR 
(CONVERT(time(0), EventStartTime) <= DATEADD(minute,59,CONVERT(time(0), @bTime)) 
    AND CONVERT(time(0), EventEndTime) >= DATEADD(minute,59,CONVERT(time(0), @bTime)))) 
AND EventDates = @bDate 

가 잘 작동하지만 난 비교할 수 있도록이 쿼리를 변환 할 필요를 확인하기 위해 다음과 같은 쿼리를 사용하고

예약 테이블 BookingDate & TimeEvents Table 나는이 테이블에있는 데이터가 시간이 지남에 따라 커질 수 있기 때문에 성능 기반 ms SQL 쿼리를 찾고 있습니다.

이벤트

EventID EventStartDate EventEndDate EventDates DT  EventStartTime EventEndTime 
17  2012-07-25  2012-07-26  2012-07-25 2012-07-25 10:00:00  12:00:00 
17  2012-07-25  2012-07-26  2012-07-26 2012-07-26 10:00:00  12:00:00 
21  2012-05-28  2012-05-28  2012-05-28 2012-05-28 18:00:00  19:00:00 
26  2012-01-01  2015-01-01  2012-07-01 2012-07-01 08:00:00  18:00:00 

예약 theabove 경우

BookingID TotalVisitors BookingDate Time BookingCancelled 
1900221519 5    2012-07-10 10:30 0 
5600515751 1    2012-07-20 10:30 0 
8044913913 41    2012-07-05 10:30 0 
1638934678 5    2012-07-20 10:30 1 
5685687635 9    2012-07-25 10:30 0 

우리는 사용자 가정은 우리가 예약을 가지고 지금 예약 테이블과 충돌 2012-07-25에 첫 번째 이벤트의 날짜를 변경할 수 있습니다 이 날짜. 사용자가 친숙한 사용자에게 예약 취소에 대한 조치 (예 : &)를 취할 수 있도록 행을 찾아야합니다.

시나리오 & 세부

내가 당신에게 우리는 우리가 월요일부터 개인 박물관을 가정 해 봅시다 투어 있도록 완전한 그림 드리겠습니다 - 오후 4시 반 10:30 오전 두 번째에서 두 개의 서로 다른 시간에 하나의 금요일 각 여행마다 최대 50 명의 방문자 (사람)를 고용 할 수 있습니다. 50 명의 그룹이 2012 년 8 월 15 일 10시 30 분에 박물관을 방문하려고한다고 가정하면 프런트 엔드에서이 날짜를 차단합니다. 이름, 주소, 회사 이름, 방문자 수, 시간 (두 항목이있는 드롭 다운 10:30 am, 04:30pm) 및 방문 날짜 (캘린더)와 같은 일반적인 필드가있는 간단한 웹 양식 인 끝 머리말 전체 예약 &에 도달 한 날짜를 차단하는 컨트롤을 사용하면 사용할 수있는 날짜 만 선택할 수 있습니다.

박물관에서는 특별 이벤트를 주최하며 예약 양식에서 해당 날짜를 차단할 수 있습니다. 2012 년 8 월 10 일 오전 9 시부 터 오후 1 시까 지 예정된 이벤트 &이 날짜는 관리자에 의해 이전에 차단되었습니다. 이제 이벤트 날짜가 2012-08-25로 변경되었습니다.이 날짜에 이벤트가 예정되지 않았으므로 더 일찍 박물관은이 날짜에 대해 일부 예약을했습니다.

박물관은 같은 날짜에 예약 한 사람들을 위해 어떤 투어도 할 수 없으므로 2012-08-25에 연락해야합니다. 이를 위해 두 테이블 이벤트 테이블 & 예약 테이블을 비교하고 10:30에 2012-08-25에 대한 예약이 있는지 찾아야합니다. 그렇다면 투어 취소에 대한 이메일로 방문자를 친밀하게해야합니다.

내 쿼리에서 우리는 EventStartTime 또는 EventEndTime 사이에 적어도 1 시간의 휴식이 필요하므로 59 분을 추가합니다.

나는 이것이 보고서를 찾고있는 데이터의 종류를 알기를 바랍니다. 내가 언급 한 쿼리는 잘 작동하지만, EVENTDATE & 시간 원하는

을과 충돌 예약 테이블의 레코드 만 보여 내가 예약 테이블 &의 각 행에 대해 이벤트 테이블에 예약 테이블에서 날짜 & 시간의 가치를 전달해야 샘플 데이터의 출력 나는 이벤트 날짜가 1시간 실제로 박물관에 방문을 지속한다는 것을 의미 가정

EventID BookingID TotalVisitors BookingDate Time BookingCancelled 
17  5685687635 9    2012-07-25 10:30 0 
+1

나는 당신이하고 싶은 것을 이해하지 못합니다. 하지만, 성능면에서 보면, 대부분의 변환과 함수가 sargable이 아니므로 한 유형에서 다른 유형으로 데이터 변환을 중단해야합니다 (http://en.wikipedia.org/wiki/Sargable). . 이렇게하면 인덱스를 사용할 수 없게됩니다. 또한 날짜로 작업 할 때'> = <=' use '> = <'; 59 분을 추가하지 않고 시간을 완료하고 <=하지만 <으로 테스트하지 마십시오. 특별한 경우는 그대로 작동하지만 날짜 값에 시간 부분을 추가하기로 결정한 후에 나중에 시간을 절약 할 수 있으므로 통일 된 접근 방식을 사용하는 것이 좋습니다. –

+0

@Nikola, 나는 당신의 조언에 따라 일할 수 있습니다, 나는이 쿼리로 원하는 결과를 얻을 수 있도록 도와 주시면 감사하겠습니다. 나중에 성능을 향상시키기 위해 데이터 형식을 변경합니다. – Learning

+0

기꺼이 도와 드리 겠지만 불행히도 나는 그 문제를 이해하지 못합니다. –

답변

2

을 변경 한 후에는 예약과 충돌하는 경우에만 같은 기록을 다음 날 표시됩니다 질의를 필요로이 1 시간은 다른 박물관 활동과 겹치지 않아야하며, 여기에는 이러한 충돌을 찾는 쿼리가 있습니다. 예약/이벤트 날짜에 두 테이블 간의 간단한 조인입니다. 취소되지 않은 예약의 경우입니다. 빈도 간격은 expression explained here을 사용하여 확인합니다. 기본적으로 범위 A의 시작 날짜에 두 개의 범위가 겹치고 범위 B의 끝 날짜와 범위 A의 끝 날짜는 범위 B의 시작 날짜보다 뒤에 있습니다. 중복을 정의하는 방법에 따라 after or equals 또는 before or equals을 읽을 수 있습니다.

select e.EventID, 
     b.BookingID, 
     b.TotalVisitors, 
     b.BookingDate, 
     b.Time, 
     b.BookingCancelled 
    from EventDatesReporting e 
inner join Bookings b 
    -- On same date 
    on e.EventDates = b.BookingDate 
    -- Overlapping intervals 
    and e.EventEndTime >= cast(b.Time as Time) 
    and e.EventStartTime < dateadd (hour, 1, cast(b.Time as Time)) 
    -- Only if booking is not cancelled 
    and b.BookingCancelled = 'false' 

.

+0

완벽하게 잘 작동합니다. 단지 내 필요에 맞게 변경해야합니다. 시간과 노력을 감사드립니다. – Learning

+0

@KnowledgeSeeker 내가 도울 수있어서 기쁩니다. –

관련 문제