Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql检查1个表中的日期是否介于不同表中的2个日期之间_Sql_Sql Server - Fatal编程技术网

Sql检查1个表中的日期是否介于不同表中的2个日期之间

Sql检查1个表中的日期是否介于不同表中的2个日期之间,sql,sql-server,Sql,Sql Server,我有两个sql表 具有Id、日期、布尔值 有身份证,日期吗 表1是这样的 1 3/1/2017 false 2 3/1/2017 true 1 1/1/2017 false 2 10/12/2016 false 表2是这样的 1 3/1/2017 2 3/1/2017 1 2/1/2017 1 12/12/2016 我想要的结果是表1中具有相同id且相互跟踪的每对日期,例如id 1为2017年1月1日和2017年3月1日 查找表

我有两个sql表

  • 具有Id、日期、布尔值
  • 有身份证,日期吗
  • 表1是这样的

        1 3/1/2017 false
        2 3/1/2017 true
        1 1/1/2017 false
        2 10/12/2016 false
    
    表2是这样的

        1 3/1/2017
        2 3/1/2017
        1 2/1/2017
        1 12/12/2016
    
    我想要的结果是表1中具有相同id且相互跟踪的每对日期,例如id 1为2017年1月1日和2017年3月1日 查找表2中是否有一个日期的id与这些日期之间的日期相同(包括同一天),且布尔值为false

    例如,这种情况下的结果是
    对于id1,2017年1月2日,2017年1月3日


    我该怎么做

    表1中可以有多少行具有相同ID?我假设为2,但即使使用1或3+,查询也能正常工作

    “相互跟踪”-任何两个日期都会相互跟踪,除非它们相同,因此下面唯一真正的检查是不平等性

    “布尔值为false”-有两行,可以具有不同的布尔值。我想他们都是假的。(false为0,true为1)

    样本数据

    这就是您的示例数据在问题中的呈现方式。至少你应该用这样的方式写日期,我们不必猜测什么是月,什么是日

    DECLARE @Table1 TABLE (ID int, dt date, Flag bit);
    INSERT INTO @Table1 (ID, dt, Flag) VALUES
    (1, '2017-01-03', 'false'),
    (2, '2017-01-03', 'true'),
    (1, '2017-01-01', 'false'),
    (2, '2016-12-10', 'false');
    
    DECLARE @Table2 TABLE (ID int, dt date);
    INSERT INTO @Table2 (ID, dt) VALUES
    (1, '2017-01-03'),
    (2, '2017-01-03'),
    (1, '2017-01-02'),
    (1, '2016-12-12');
    
    查询

    WITH
    CTE
    AS
    (
        SELECT
            ID
            ,MIN(dt) AS StartDT
            ,MAX(dt) AS EndDT
            ,MAX(CAST(Flag AS int)) AS MaxFlag
        FROM @Table1 AS Table1
        GROUP BY ID
    )
    SELECT
        CTE.ID
        ,A.dt
    FROM
        CTE
        CROSS APPLY
        (
            SELECT
                Table2.dt
            FROM @Table2 AS Table2
            WHERE
                Table2.ID = CTE.ID
                AND Table2.dt >= CTE.StartDT
                AND Table2.dt <= CTE.EndDT
        ) AS A
    WHERE
        StartDT < EndDT -- "are following each other"
        AND MaxFlag = 0 -- "the boolean is false" for both IDs
    ;
    

    (ID,dt)
    上的
    表2
    上的索引将有很大帮助。

    添加一些示例表数据和预期结果(以及格式良好的文本)。还将显示您当前的查询尝试。并标记您正在使用的dbms。“表1中的两个连续日期”是什么意思?您的问题,并添加一些样本数据和基于该数据的预期输出。请注意,表2中的每个日期都将介于表1中的日期之间,但
    >max(表1.date)
    的日期除外。请编辑此问题以便更容易理解,谢谢您的评论
    +----+------------+
    | ID |     dt     |
    +----+------------+
    |  1 | 2017-01-02 |
    |  1 | 2017-01-03 |
    +----+------------+