如何在sql中对重叠的间隔部分求和

时间:2014-01-07 21:00:22

标签: sql sql-server time intervals

我有2个时间间隔表。一个是时间表,另一个是系统的登录和退出。我需要看到重叠的间隔,并将它们重叠的部分相加。有没有一种有效的方法来做到这一点。我目前正在尝试下面的内容。但是,当在该段之前和之后登录和退出时,它不起作用。这意味着他们在整个细分市场都已登录。当它应该是整个段时间时,它当前返回0。我知道我这样做是错误的,试图看看是否有我应该遵循的模式。 SQL让我感到困惑,我相信......这就是我想要总结的内容:

OverlappingSegments

此SQL获取重叠的段。现在我拥有它们,我需要选择件来对重叠的部分求和。我不知道是否有一个方程可以做到。

FROM SCRD.APEMPSTAT
INNER JOIN AMS.EwfmSegmentData
ON SCRD.APEMPSTAT.Resource_XID = AMS.EwfmSegmentData.Resource_XID
    AND SCRD.APEMPSTAT.SignIn < AMS.EwfmSegmentData.StopDate
    AND SCRD.APEMPSTAT.SignOut > AMS.EwfmSegmentData.StartDate
INNER JOIN SCRD.SEGAP
ON AMS.EwfmSegmentData.CODE = SCRD.SEGAP.CODE
WHERE persp_ap = 'NO'

2 个答案:

答案 0 :(得分:0)

我会摆脱

AND SCRD.APEMPSTAT.SignIn < AMS.EwfmSegmentData.StopDate
AND SCRD.APEMPSTAT.SignOut > AMS.EwfmSegmentData.StartDate

在你的连接中,并在WHERE子句中执行它只是为了使它更具可读性。

以下是我在你的WHERE中的内容:

AND ((SCRD.APEMPSTAT.SignIn 
        BETWEEN AMS.EwfmSegmentData.StartDate AND AMS.EwfmSegmentData.StopDate) OR
     (SCRD.APEMPSTAT.SignOut 
        BETWEEN AMS.EwfmSegmentData.StartDate AND AMS.EwfmSegmentData.StopDate) OR
     (SCRD.APEMPSTAT.SignIn < AMS.EwfmSegmentData.StartDate AND
       SCRD.APEMPSTAT.SignOut > AMS.EwfmSegmentData.StopDate))

我确信有一种方法可以摆脱其中的一些但是这应该可以获得您正在寻找的记录。

答案 1 :(得分:0)

看了我自己的形象。我想我解决了。 SQL看起来像这样。

DATEDIFF(s, CASE 
        WHEN Startdate > SignIn
            THEN StartDate
        ELSE SignIn
        END, CASE 
        WHEN StopDate < SignOut
            THEN StopDate
        ELSE Signout
        END)

这归结为B和Y中的较小者减去A或X中的较大者。我只是一个接一个地制作了我将使用的等式: 1. B-X 2. Y-A 3. Y-X 4. B-A 从那时我意识到,开始时总是B或Y而负部分总是X或A.然后我看了为什么我选择了每个。因此,较小和更大的一块。我希望这可以帮助其他人。那段约会的作品是我想要的差距几秒钟。