SQL - 使用不同的表来获取两个日期之间的行

时间:2017-12-29 14:54:19

标签: sql 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。我无法处理;我认为它需要一个子查询,但我不知道。

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

2 个答案:

答案 0 :(得分:1)

鉴于以下表格:

CREATE TABLE #table1 ([Name] VARCHAR(15), startdate DATETIME, enddate DATETIME)
CREATE TABLE #table2 ([Name] VARCHAR(15), starthour DATETIME, [data] VARCHAR(MAX))

INSERT INTO #table1 (Name, startdate, enddate)
VALUES ('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')

INSERT INTO #table2 (Name, starthour, data)
VALUES ('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...')

以下查询似乎适用于您想要的内容:

SELECT t2.name, t2.starthour, t2.[data] 
FROM #table2 t2
INNER JOIN #table1 t1 ON t1.name = t2.name
WHERE t2.starthour BETWEEN t1.startdate AND t1.enddate

结果:

[name]  [starthour]             [Data]
----------------------------------------
Timmy   2017-09-13 06:00:00.000 Data1...
Timmy   2017-09-13 07:00:00.000 Data3...
Timmy   2017-09-12 14:00:00.000 Data4...

答案 1 :(得分:0)

如上所述,NOT EXISTS可能就是这里的方式。 NOT IN是另一种选择。我们的想法是您将查询基于表2,然后使用针对表1的NOT EXISTS过滤WHERE子句中的输出。

例如:

SELECT
    t2.Name,
    t2.StartHour
FROM #Table2 t2
WHERE NOT EXISTS (
        SELECT 1
        FROM #Table1 t1
        WHERE t1.Name = t2.Name
            AND t1.StartDate <= t2.StartHour
            AND t2.EndDate > t2.StartHour
    );

有关EXISTS的更多信息,以及EXISTS和IN之间的比较:

EXISTS (Transact-SQL)