我正在尝试计算用户的总体验。注意事项:
我当前的查询以几天为单位获取总经验。
SELECT SUM(DATEDIFF(DAY, EX.TimePeriodStart,
CASE
WHEN EX.TimePeriodEnd IS NULL
THEN GETUTCDATE()
ELSE EX.TimePeriodEnd
END)) AS 'TotalExpInDays',
EX.UserPersonalDetailsId
FROM Experience EX
GROUP BY EX.UserPersonalDetailsId
但是,用户可以在特定时间段内完成多项工作。因此,我决定从总时间中减去通用天数。
我用于计算平日的查询:
SELECT SUM(CASE
WHEN EX.TimePeriodStart BETWEEN EX2.TimePeriodStart AND EX2.TimePeriodEnd
THEN DATEDIFF(DAY, EX.TimePeriodStart,
CASE
WHEN EX2.TimePeriodEnd IS NULL
THEN GETUTCDATE()
ELSE EX2.TimePeriodEnd
END)
ELSE 0
END) AS 'DaysToSub',
EX.UserPersonalDetailsId
FROM Experience EX
LEFT JOIN Experience EX2 ON EX2.UserPersonalDetailsId = EX.UserPersonalDetailsId
AND EX2.ExperienceId != EX.ExperienceId
WHERE EX.UserPersonalDetailsId = UserPersonalDetailsId -- userId-int
GROUP BY EX.UserPersonalDetailsId
这是link的小提琴(针对MySQL稍作修改)
此查询的问题:如果有两个重叠的日期,但是如果有两个以上的重叠行,则显示正确的值(如果将同一日期与多于一个的行进行比较,这是合乎逻辑的),它将给出正确的值。如何避免这种情况?
在这里写下这个问题感到很复杂,我试图使其尽可能简单。任何帮助将不胜感激。
编辑:
示例输入:
Id | startdate | enddate | UserId -: | :------------------ | :------------------ | -----: 1 | 01/03/2018 00:00:00 | 31/03/2018 00:00:00 | 1 4 | 18/04/2019 00:00:00 | 15/05/2019 00:00:00 | 1 2 | 15/03/2018 00:00:00 | 15/04/2018 00:00:00 | 1 3 | 17/04/2018 00:00:00 | 15/04/2019 00:00:00 | 1
所需的输出:
Id | startdate | enddate | UserId -: | :------------------ | :------------------ | -----: 1 | 01/03/2018 00:00:00 | 31/03/2018 00:00:00 | 1 4 | 18/04/2019 00:00:00 | 15/05/2019 00:00:00 | 1 2 | 31/03/2018 00:00:00 | 15/04/2018 00:00:00 | 1 3 | 17/04/2018 00:00:00 | 18/04/2019 00:00:00 | 1
这个问题对我来说很复杂。似乎无法解决我的问题!