SQL - 使用2个表(日期范围/小时)获取日期范围内的记录

时间:2017-12-29 07:22:30

标签: sql-server tsql datetime

我有两张桌子:

表1:

Name, StartDate, EndDate   

前:

Timmy, 9/12/17 08:00:00, 9/13/17 00:00:00   
Timmy, 9/13/17 05:00:00, 9/13/17 07:00:00

表2:

Name, StartHour, Data...  

前:

Timmy, 9/13/17 06:00:00, Data1...   
Timmy, 9/13/17 04:00:00, Data2...   
Timmy, 9/13/17 07:00:00, Data3...  
Timmy, 9/12/17 14:00:00, Data4...  

因此,我需要获得表2中的每条记录,其中起始小时不在表1中的日期范围内。这需要针对每个名称进行(因此T1 / T2中可以有多个匹配的名称)看T2的数据列是不同的。它应该包含在左侧,不包括在右侧。

所以对于这个查询,我想看看

Timmy, 9/13/17 04:00:00, Data2...  
Timmy, 9/13/17 07:00:00, Data3... (Inclusive on end date)  

我不介意它是否加入;我可以删除额外的列。我不想看到重复。我还会遇到问题,我会检查是否(StartHour> = StartDate AND St​​artHour< EndDate)。因此,需要针对表1中具有匹配名称的每一行检查表2中的每一行/ startHour。我无法处理;我认为它需要一个子查询,但我不知道。

检查它是否在范围内,但是否定因为我不想要它们,如果它们在范围内(包括,不包括)。

3 个答案:

答案 0 :(得分:0)

我的解决方案尝试是:

SELECT *
FROM T1 LEFT JOIN T2 
ON T1.Name = T2.Name  
AND NOT (T2.StartHour >= T1.StartDate AND T2.StartHour < T2.EndDate) 

然后抓住没有空的地方。

条件可以评估为真在T2的行中,对于T1行1,但是T1行2,3,4,......,它实际上是真的,所以我得到4个结果或者其他什么。或者它只是没有正确评估它,因为它不会查看T1中的所有行。

答案 1 :(得分:0)

对于table2与table1匹配的每个条目,您可以计算违反条件的次数以及是否违反条件甚至一次,您不希望输出中的条件。这是通过在下面的查询中使用SUM(CASE WHEN..)来完成的。

SELECT T2.NAME, T2.STARTHOUR, T2.DATA
FROM
TABLE1 T1
INNER JOIN
TABLE2 T2
ON T1.NAME = T2.NAME
GROUP BY T2.NAME, T2.STARTHOUR, T2.DATA
HAVING SUM(CASE WHEN T2.STARTHOUR >= T1.STARTDATE AND T2.STARTHOUR < T1.STARTDATE THEN 1 ELSE 0 END) = 0;

根据排除规则和包含规则,如果table2的starthour与table1的enddate相同,则可以看到规则未被违反。

答案 2 :(得分:0)

您可以使用此查询。

SELECT DISTINCT T2.* 
FROM Table2 T2
WHERE 
   NOT EXISTS (SELECT * FROM Table1 T1 WHERE 
        T1.Name = T2.Name
        AND T2.StartHour > T1.StartDate 
        AND T2.StartHour < T1.EndDate )