2013-03-18 3 views
-1

У меня есть две таблицы.Присоединиться к запросу для временного диапазона

MAP

Product Channel ProgDate AdvTime 
Air Pix 30-04-2011 20:57:16 
Air Pix 30-05-2011 00:55:08 

MBA

Product Channel Date ProgStartTime ProgEndTime 
Air Pix 30-04-2011 23:00:00 02:00:00 
Air Pix 30-04-2011 21:00:00 22:00:00 

Я должен проверить, является ли AdvtTime в МАП находится между StartTimeEndTime & в таблице MBA.

Но когда продолжительность (ProgStartTime - ProgEndTime) составляет один час, мне нужен буфер + или - 5 минут.

мне нужно 00:05:08 to match 23:00:00 к 02:00:00 и 20:57:16 to match 21:00:00 к 22:00:00.

Я использовал ниже запрос присоединиться

Select Distinct mb.Id as mbaid,mp.id as mapid, mp.Channel as Channel, mp.Product,mp.ProgDate, mp.AdvTime, mb.Channel, mb.ProgStartTime, 
    mb.ProgEndTime, convert(time, dateadd(minute, datediff(minute, mb.progStartTime, mb.progEndTime), 0)) as timeDiff from map22 as mp inner join mba22 as mb 
on ((mp.ProgDate = mp.ProgDate and mp.Channel=mb.Channel and mp.Product=mb.Product)) 
where (mp.ProgDate = mb.ProgDate 
      AND AdvTime >= ProgStartTime 
      AND (AdvTime <= ProgEndTime OR ProgEndTime < ProgStartTime)) 
      OR 
      (mp.ProgDate = Dateadd(day,1,mb.ProgDate) 
      AND ProgEndTime < ProgStartTime 
      AND AdvTime <= ProgEndTime) 
order by mp.Id asc 
+0

Пожалуйста, не спрашивайте дублирующие вопросы - http://stackoverflow.com/questions/15477708/sql-join-with-a-buffer- время – rbedger

+0

Извините, но я не получил правильный результат там, так как мой вопрос не был четко оформлен. Может ли кто-нибудь помочь мне в этом случае –

+0

Можете ли вы предоставить данные типа столбца для ваших таблиц? –

ответ

0
Select Distinct mb.Id as mbaid, 
     mp.id as mapid, 
     mp.Channel as Channel, 
     mp.Product, 
     mp.ProgDate, 
     mp.AdvTime, 
     mb.Channel, 
     mb.ProgStartTime, 
     mb.ProgEndTime, 
     convert(time, dateadd(minute, datediff(minute, mb.progStartTime, mb.progEndTime), 0)) as timeDiff 
From map22 as mp 
Inner Join mba22 as mb 
     on mp.ProgDate = mp.ProgDate 
     and mp.Channel= mb.Channel 
     and mp.Product= mb.Product 
Where mp.ProgDate = mb.ProgDate 
And  Convert(DateTime,ProgDate) + Convert(DateTime,AdvTime) 
      Between 
      Case 
      When ProgEndTime < ProdStartTime And DateDiff(hh,ProgEndTime,ProgStartTime) > 23 Then DateAdd(mi,-5,Convert(DateTime,[Date]) + Convert(DateTime,ProgStartTime)) 
      When ProgEndTime > ProdStartTime And DateDiff(hh,ProgStartTime,ProgEndTime) > 1 Then DateAdd(mi,-5,Convert(DateTime,[Date]) + Convert(DateTime,ProgStartTime)) 
      Else Convert(DateTime,[Date]) + Convert(DateTime,ProgStartTime) End 
      And 
      Case 
      When ProgEndTime < ProdStartTime And DateDiff(hh,ProgEndTime,ProgStartTime) > 23 Then DateAdd(mi,5,Convert(DateTime,Case When ProgEndTime < ProdStartTime Then DateAdd(dd,1,[Date]) Else [Date] End) + Convert(DateTime,ProgEndTime)) 
      When ProgEndTime > ProdStartTime And DateDiff(hh,ProgStartTime,ProgEndTime) > 1 Then DateAdd(mi,5,Convert(DateTime,Case When ProgEndTime < ProdStartTime Then DateAdd(dd,1,[Date]) Else [Date] End) + Convert(DateTime,ProgEndTime)) 
      Else (Case When ProgEndTime < ProdStartTime Then DateAdd(dd,1,Convert(DateTime,[Date])) Else Convert(DateTime,[Date]) End) + Convert(DateTime,ProgEndTime) End 
Order By mp.Id Asc 
+0

Спасибо за ваше время, но пятиминутный буфер необходим только тогда, когда продолжительность [progstarttime -progendtime] меньше или равна одному часу. А также не могу сопоставить значение следующего дня i.e 00:05:08 с 23:00:00 до 02:00:00, –

+0

Отредактировано, попробуйте еще раз, если это сработает, я очищу его. –

+0

Извините, пока не появляется время, превышающее полночь –

Смежные вопросы