【发布时间】:2019-11-26 06:06:20
【问题描述】:
我的目标是找出每人每天轮班的总工作时间或每人轮班的总小时数,这些轮班或每人轮班的总小时数都带有一个值,并且在任何一天工作的前 8 小时内(不包括休息时间)。然后显示标记的班次以及符合条件的总价值。
示例
- 凌晨 2 点 - 凌晨 4 点(2 小时)- 正常班次
- 上午 5 点 - 上午 9 点(4 小时)- 标记班次
- 上午 10 点 - 下午 3 点(5 小时)- 标记班次
符合条件的总时间为 4 小时(上午 5 点至上午 9 点)+ 2 小时(上午 10 点至下午 12 点)
源表格式
个人ID |工作日期 |开始时间 |结束时间 |工作时间(预先计算)|换档
DECLARE @Table TABLE
(
PersonID INT
, WorkDate DATETIME
, StartTime DATETIME
, FinishTime DATETIME
, HoursWorked DECIMAL(4, 2)
, ShiftType VARCHAR(50)
);
INSERT INTO @Table VALUES (100,'2019-11-26','1900-01-01T02:00:00', '1900-01-01T04:00:00',2,'Normal')
INSERT INTO @Table VALUES (100,'2019-11-26','1900-01-01T05:00:00', '1900-01-01T09:00:00',4,'Tagged')
INSERT INTO @Table VALUES (100,'2019-11-26','1900-01-01T10:00:00', '1900-01-01T15:00:00',5,'Tagged')
结果集
+----------+------------+---------------------+---------------------+------------------------------+-----------+---------------+
| PersonID | WorkDate | StartTime | FinishTime | HoursWorked (pre calculated) | ShiftType | EligibleHours |
+----------+------------+---------------------+---------------------+------------------------------+-----------+---------------+
| 100 | 2019-11-26 | 1900-01-01T05:00:00 | 1900-01-01T09:00:00 | 4 | Tagged | 4 |
+----------+------------+---------------------+---------------------+------------------------------+-----------+---------------+
| 100 | 2019-11-26 | 1900-01-01T10:00:00 | 1900-01-01T15:00:00 | 5 | Tagged | 2 |
+----------+------------+---------------------+---------------------+------------------------------+-----------+---------------+
【问题讨论】:
-
SO 不是代码编写服务,您需要尝试在卡住时提出问题。
-
感谢您的回复。我尝试了几种方法,但找不到正确的方法。它的解决方案似乎是在将光标编码为循环并返回符合条件的小时数(可能性能也很慢)或可以计算窗口限制的查询之间,这样我就可以在第一个班次开始时间和限制时间之间进行总计。在我的示例中,这将是凌晨 2 点到下午 12 点之间的时间。我找不到计算该限制的方法。
-
展示你的尝试——当然它不能正常工作,这就是你寻求帮助的原因:)
-
我同意 Dale 的观点,但在这种情况下,我觉得我尝试使用窗口或运行总计的尝试可能会产生误导,并且与实际解决方案无关。就像在寻找苹果时提供香蕉一样。下次我会更好地记录我的研究。
标签: sql sql-server ranking row-number windowing