2013-03-18 107 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在MAP是MBA表StartTime & EndTime之间。

但是,当持续时间(ProgStartTime-ProgEndTime)是一个小时我需要一个+或 - 5分钟的缓冲区。

我需要 00:05:08 to match 23:00:0002:00:00,并 20:57:16 to match 21:00:0022: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 2013-03-18 17:13:33

+0

很抱歉,我没有得到正确的结果,因为我的问题没有明确的框架。有人可以帮我解决这个问题 – 2013-03-18 17:15:41

+0

你能提供表格的列数据类型详细信息吗? – 2013-03-18 17:33:34

回答

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]小于或等于一个小时时,五分钟缓冲区才是必需的。 也不能匹配第二天的值 即00:05:08与23:00:00到02:00:00, – 2013-03-18 18:09:26

+0

编辑,再试一次,如果这个工作,然后我会清理它。 – 2013-03-18 18:33:48

+0

对不起还没有显示超过午夜的时间 – 2013-03-18 18:46:38