2015-11-10 87 views
0

我有以下脚本。我需要在30天内获得客户回来的所有访问。在脚本中一切正常,但在where子句中有datediff。有人可以帮我修理逻辑吗?DATEDIFF在WHERE子句中不起作用

select OverallNumber,VisitID,coalesce(CheckInDateTime,ServiceDateTime) as ArrivalDateTime, DepartDateTime 
from Visits 
where OverallNumber='100' 
and DepartDateTime is not null 
and coalesce(CheckInDateTime,ServiceDateTime) is not null 
--and DATEDIFF(day,MIN(coalesce(CheckInDateTime,ServiceDateTime)), Max(DepartDateTime))<30 
order by ArrivalDateTime; 

当前数据:

OverallNumber VisitID ArrivalDateTime DepartDateTime 
100    1  6/13/2015  6/15/2015 
100    2  11/5/2015  11/7/2015 
100    3  11/20/2015  11/25/2015 

Desired: 
OverallNumber VisitID ArrivalDateTime DepartDateTime 
    100    2  11/5/2015  11/7/2015 
    100    3  11/20/2015  11/25/2015 

在这个例子中的客户回来了两次,从2015年11月5日至2015年11月25日。请帮忙。谢谢。

+1

你不能把一个MIN()在WHERE子句。使用CTE,子选择或派生表。 –

+0

嗨Tab!我明白了,但我稍后会将这个脚本转移到另一个应用程序,所以我试图避免使用CTE或任何复杂的东西。我想知道如果我应该做一个日期加载或子查询。只是无法弄清楚。 –

+1

如果您将脚本转移到另一个也在使用sql 2012的应用程序,则可以使用延迟功能获取结果https://msdn.microsoft.com/en-us/library/hh231256.aspx – JamieD77

回答

1
SELECT OverallNumber, 
     VisitID, 
     ArrivalDateTime, 
     DepartDateTime 
FROM (
    SELECT 
     OverallNumber, 
     VisitID, 
     ArrivalDateTime, 
     DepartDateTime, 
     LAG(DepartDateTime, 1, NULL) OVER (PARTITION BY OverallNumber ORDER BY ArrivalDateTime) PreviousDateDiff, 
     LEAD(ArrivalDateTime, 1, NULL) OVER (PARTITION BY OverallNumber ORDER BY ArrivalDateTime) NextDateDiff 
    FROM (
     SELECT 
      *, 
      COALESCE(CheckInDateTime,ServiceDateTime) ArrivalDateTime 
     FROM  
      Visits 
     WHERE 
      OverallNumber = '100' 
      AND DepartDateTime IS NOT NULL) t   
    ) v 
WHERE 
    ArrivalDateTime < DATEADD(day, 30, PreviousDateDiff) 
    OR DATEADD(day, -30, NextDateDiff) < DepartDateTime 
ORDER BY 
    ArrivalDateTime; 

的滞后会给你以前DepartDateTime和铅的功能会给你的下一个ArrivalDateTime

+0

这仍然给了我30天前的所有访问。 –

+0

如果我把你的'当前数据'和运行查询反对它..我只得到你的'期望'结果.. http://sqlfiddle.com/#!6/66bea/1 – JamieD77

+0

是的,我重新创建一个小提琴checkindate和servicedata。您的查询为我提供了所需的输出。非常感谢。让我玩一下,然后标记答案。 http://sqlfiddle.com/#!6/4f15f/1 –