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

时间:2016-01-14 17:48:47

标签: sql sql-server tsql sql-server-2014

我有一个商店表,其中包含storename,agentname,date,shiftStartTime,shiftEndTime。我试图找出是否有任何商店在任何时间间隔存在没有代理存储。数据应按商店,日期分组。以下是我数据的样本记录

i1 <- with(mydf, V1==3)
mydf[sort(unique(c(which(i1),pmin(which(i1)+1L, nrow(mydf))))),]

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

2 个答案:

答案 0 :(得分:1)

这可能是你想要做的。

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小提琴.. SQL FIDDLE如果你可以添加数据来打破它,请告诉我。

如果你有一个唯一的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)
                    )

答案 1 :(得分:1)

我试图做类似的事情虽然我对覆盖深度感兴趣(每个细分市场中有多少员工)。我找到了一篇很好的文章,帮助我完成了解决方案的大部分工作:

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