我需要能够在工作时间内提取上个月员工休假的时间。
EX:如果员工从周五早上 8 点到下周一下午 5 点下班,则该实例的“DurationOff”将为 18 小时(基于周一至周五上午 8 点至下午 5 点的工作时间)。
我拥有的 2 位数据在 SqlFiddle 中。如果需要,可以提供脚本。
#1。 TechTimeOff:技术在上个月关闭的每个实例。 “DurationOff”列是我想要实现的(以分钟或小数为单位)。
技术编号 | 技术名称 | TimeOff_From | TimeOff_To | TimeOff_ID | 来自(每月一分钟) | 至(每月一分钟) | *持续时间关闭 |
---|---|---|---|---|---|---|---|
1 | 海狸 | 2023-02-01 08:00 | 2023-02-01 16:30 | 23 | 480 | 990 | 8.50 小时(或 510 分钟) |
2 | 沃利 | 2023-02-01 08:00 | 2023-02-03 17:00 | 24 | 480 | 3060 | 27.00 小时(或 1620 分钟) |
3 | 病房 | 2023-02-01 08:00 | 2023-02-06 17:00 | 25 | 480 | 6120 | 36.00 小时(或 2160 分钟) |
#2。日历:上个月的每一分钟。如果该分钟不在营业时间参数内,则 BusinessTime =“否”。
(只显示适用于这篇文章的行)
日期和时间 | 日名 | 每月一分钟 | 每日一小时 | 营业时间 |
---|---|---|---|---|
2023-02-01 07:59:00 | 星期三 | 479 | 7 | 没有 |
2023-02-01 08:00:00 | 星期三 | 480 | 8 | 是 |
2023-02-01 16:30:00 | 星期三 | 990 | 16 | 是 |
2023-02-03 17:00:00 | 星期五 | 3060 | 17 | 是 |
2023-02-04 08:00:00 | 星期六 | 1920 | 8 | 没有 |
2023-02-06 17:00:00 | 星期一 | 6120 | 17 | 是 |
我可能会绕着屁股走到我的肘部,但这是我实现正确“DurationOff”值的总体计划:
一个。让 TechTimeOff 表显示技术关闭的每一分钟的行。然后添加“MinuteOfTheMonth”列,显示技术关闭的每一行的值。
---> 还没有想出如何按分钟将休息时间分成几行,并认为这可能是我遗漏的部分?
乙。然后,我将使用 Calendar.MinuteOfTheMonth = TechTimeOff.MinuteOfTheMonth 加入表(在 步骤 A)
C。然后,我会计算(或以其他方式计算)TimeOff_From 和 TimeOff_To 之间的分钟数,不包括任何分钟 Calendar.BusinessTime 喜欢'不'
我什至不确定上述过程是否有效。 有人可以帮忙吗?
------------------------------------------------ ----------------------------------
我假设休息时间需要按分钟划分,这样我就可以加入 Calendar.MinuteOfTheMonth = TechTimeOff.MinuteOfTheMonth 上的表格(在步骤 A 中添加的 col)。
这将允许我在尝试获取 DurationOff 时过滤掉 BusinessTime LIKE 'No' 的分钟数。
由于您的日历表包含每一分钟,您可以加入它并执行
count(*)
,这是您需要的持续时间(以分钟为单位)
select t.TechID, t.TechName, Duration = count(*)
from TechTimeOff t
inner join Calendar c on c.Day_Time >= t.TimeOff_From
and c.Day_Time < t.TimeOff_To
where c.BusinessTime = 'Yes'
group by t.TechID, t.TechName;