我有2个时间间隔表。一个是时间表,另一个是系统的登录和退出。我需要看到重叠的间隔,并将它们重叠的部分相加。有没有一种有效的方法来做到这一点。我目前正在尝试下面的内容。但是,当在该段之前和之后登录和退出时,它不起作用。这意味着他们在整个细分市场都已登录。当它应该是整个段时间时,它当前返回0。我知道我这样做是错误的,试图看看是否有我应该遵循的模式。 SQL让我感到困惑,我相信......这就是我想要总结的内容:
此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'
答案 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.然后我看了为什么我选择了每个。因此,较小和更大的一块。我希望这可以帮助其他人。那段约会的作品是我想要的差距几秒钟。