두 테이블 간의 데이터를 비교하고 충돌이 있는지 확인해야합니다. 이 개 테이블 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 & Time
와 Events 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
나는 당신이하고 싶은 것을 이해하지 못합니다. 하지만, 성능면에서 보면, 대부분의 변환과 함수가 sargable이 아니므로 한 유형에서 다른 유형으로 데이터 변환을 중단해야합니다 (http://en.wikipedia.org/wiki/Sargable). . 이렇게하면 인덱스를 사용할 수 없게됩니다. 또한 날짜로 작업 할 때'> = <=' use '> = <'; 59 분을 추가하지 않고 시간을 완료하고 <=하지만 <으로 테스트하지 마십시오. 특별한 경우는 그대로 작동하지만 날짜 값에 시간 부분을 추가하기로 결정한 후에 나중에 시간을 절약 할 수 있으므로 통일 된 접근 방식을 사용하는 것이 좋습니다. –
@Nikola, 나는 당신의 조언에 따라 일할 수 있습니다, 나는이 쿼리로 원하는 결과를 얻을 수 있도록 도와 주시면 감사하겠습니다. 나중에 성능을 향상시키기 위해 데이터 형식을 변경합니다. – Learning
기꺼이 도와 드리 겠지만 불행히도 나는 그 문제를 이해하지 못합니다. –