找到时间间隔之间缺失的间隙

Find the missing gaps in between time intervals

我有一家商店 table,其中有商店名称、代理商名称、日期、shiftStartTime、shiftEndTime。我正在尝试查找是否有任何商店在任何时间间隔内都没有店内代理。数据应按商店、日期分组。以下是我数据中的样本记录

STORE_NAME  DISTRICT REGION   NAME  WORK_DATE   ShftStTim   ShftEdTimeenter 

A0004         65    Mid-West    Abc 1/14/2016   12:30:00    12:59:59
A0004         65    Mid-West    Abc 1/14/2016   8:00:00     12:30:00
A0004         65    Mid-West    Abc 1/14/2016   12:59:59    15:59:59
A0004         65    Mid-West    xyz 1/14/2016   19:30:00    20:00:00
A0004         65    Mid-West    xyz 1/14/2016   15:00:00    19:30:00
A0004         65    Mid-West    xyz 1/14/2016   20:00:00    23:00:00
A0004         65    Mid-West    cde 1/14/2016   15:00:00    15:30:00
A0004         65    Mid-West    cde 1/14/2016   11:00:00    15:00:00
A0004         65    Mid-West    cde 1/14/2016   15:30:00    18:59:59
A0004         65    Mid-West    fgh 1/14/2016   15:00:00    15:30:00
A0004         65    Mid-West    fgh 1/14/2016   11:00:00    15:00:00
A0004         65    Mid-West    fgh 1/14/2016   15:30:00    18:59:59
A0005         64    Mid-West    jkl 1/14/2016   13:30:00    14:00:00
A0005         64    Mid-West    jkl 1/14/2016   9:59:59     13:30:00
A0005         64    Mid-West    jkl 1/14/2016   14:00:00    16:00:00
**A0005       64    Mid-West    jkl 1/14/2016   16:30:00    18:00:00**

如果你看到上面的例子,我想得到最后一行,它告诉我们有 30 分钟的间隔,没有代理存在,或者按日期和间隔持续时间的商店名称也可以。 时间范围不连续。提前致谢!

这可能就是您想要做的。

SELECT  *
FROM    Table1 t1
WHERE   NOT EXISTS ( SELECT *
                     FROM   Table1 t2
                     WHERE  t2.WORK_DATE = t1.WORK_DATE
                            AND t2.STORE_NAME = t1.STORE_NAME
                            AND (t1.ShftStTim BETWEEN t2.ShftStTim
                                              AND     t2.ShftEdTimeenter
                                 OR t1.ShftEdTimeenter BETWEEN t2.ShftStTim
                                                       AND     t2.ShftEdTimeenter) 
                            AND (t1.ShftStTim <> t2.ShftStTim
                                OR t1.ShftEdTimeenter <> t2.ShftEdTimeenter))

这是一个 SQL Fiddle 的。SQL FIDDLE 如果你可以添加数据来破解它,请告诉我。

如果您有一个 UNIQUE ID 来过滤 NOT EXISTS 会很有帮助,但您可以使用 ROW_NUMBER 添加一个,这可能比使用 TIME 位更准确。不过性能可能没那么好。

编辑

;WITH cte AS 
(
    SELECT  *,
            ROW_NUMBER() OVER(ORDER BY [STORE_NAME]) AS Rn,
            COUNT(*) OVER (PARTITION BY [STORE_NAME], [WORK_DATE]) Cnt
    FROM    Table1
)
SELECT  *
FROM    cte t1
WHERE   Cnt > 1 -- only stores with more than one shift per day
        AND NOT EXISTS ( SELECT *
                     FROM   cte t2
                     WHERE  t1.Rn <> t2.Rn
                            AND t2.WORK_DATE = t1.WORK_DATE
                            AND t2.STORE_NAME = t1.STORE_NAME
                            AND (t1.ShftStTim BETWEEN t2.ShftStTim
                                              AND     t2.ShftEdTimeenter
                                 OR t1.ShftEdTimeenter BETWEEN t2.ShftStTim
                                                       AND     t2.ShftEdTimeenter)
                    )

虽然我对覆盖深度感兴趣(每个部分有多少员工),但我正在尝试做类似的事情。我发现了一篇很好的文章,它帮助我获得了大部分解决方案:

https://www.simple-talk.com/sql/t-sql-programming/calculating-gaps-between-overlapping-time-intervals-in-sql/