Sql检查1个表中的日期是否介于不同表中的2个日期之间
我有两个sql表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日 查找表
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 |
+----+------------+