【问题标题】:SQL - Grab Rows That Are Between 2 Dates Using Different TablesSQL - 使用不同的表抓取两个日期之间的行
【发布时间】:2017-12-29 14:54:19
【问题描述】:

我有两张桌子:

表 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

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

【问题讨论】:

  • ... where not exists ( select 42 from ... ) 可能会有所帮助。
  • 您的查询目前是什么样的?您是否收到任何错误或不正确的结果?

标签: sql tsql datetime


【解决方案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...

【讨论】:

    【解决方案2】:

    如上所述,NOT EXISTS 可能是这里的方式。 NOT IN 是另一种选择。这个想法是您将查询基于表 2,然后使用 NOT EXISTS 针对表 1 过滤 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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2022-01-04
      • 2016-01-31
      • 2021-08-10
      • 2015-06-05
      相关资源
      最近更新 更多