我需要为3种不同类型的班次定义班次长度:8,10或12小时班次。
8小时轮班:
第一班:上午6点至下午2点
第二班:下午2点至晚上10点
第3班:晚上10点至6点
10小时轮班:
第一班:上午5点至下午3点
第二班:下午3点至凌晨1点
12小时轮班:
第一班:上午3点至下午3点
第二班:下午3点至凌晨3点
问题在于我不确定处理午夜转换的最佳方法是什么。当你执行Datediff("n", #10:00:00:pm#, #06:00:00#)
时,它会给出一个负值,因为它认为你想要从早上6点到晚上10点的时差(但是有一个负值)。这不是我想要的。
下面的代码一直给出我在午夜线上变化的时间的负值。
这里非常棘手的部分是,用户可以提交start_time
,比如说,凌晨2:30:00, 过去 午夜线。这进一步使事情复杂化。
我怎样才能使我的代码不仅返回正确的班次长度,还考虑到用户在午夜之后提交开始时间的可能性?
(Switch
(Max([dbo_job.Uf_Shift_Standard])="8",
(Switch(
(tbl_OEE.shift = "SH1"),
Datediff("n", Max([start_time]), [end_time]),
(tbl_OEE.shift = "SH2"),
Datediff("n", Max([start_time]), [end_time]),
True,
Datediff("n", Max([start_time]), #23:59:59#) + Datediff("n", #00:00:00#, #06:00:00#))),
Max([dbo_job.Uf_Shift_Standard])="10",
(Switch(
(tbl_OEE.shift = "SH1"),
Datediff("n", Max([start_time]), [end_time]),
True,
Datediff("n", Max([start_time]), #23:59:59#) + Datediff("n", #00:00:00#, #01:00:00#))),
Max([dbo_job.Uf_Shift_Standard])="12",
(Switch(
(tbl_OEE.shift = "SH1"),
Datediff("n", Max([start_time]), #15:00:00#),
True,
Datediff("n", Max([start_time]), #23:59:59#) + Datediff("n", #00:00:00#, #03:00:00#)))
)
) AS actual_shift_length_minutes
答案 0 :(得分:1)
您可以为时差添加1(=一天),然后使用 TimeValue 直接计算它以删除日期部分:
ShiftDuration = TimeValue(CDate(#06:00:00 am# - #10:00:00 pm# + 1))
ShiftDuration = TimeValue(CDate(#10:00:00 pm# - #02:00:00 pm# + 1))
ShiftDuration = TimeValue(CDate(#02:00:00 pm# - #06:00:00 am# + 1))
所有这些都会返回08:00:00
的日期/时间值(时间跨度),可以根据需要使用格式进行格式化显示或转换为小时和/或分钟。< / p>
如果您需要显示超过24小时的持续时间,请使用以下功能:
Public Function FormatHourMinute( _
ByVal datTime As Date, _
Optional ByVal strSeparator As String = ":") _
As String
' Returns count of days, hours and minutes of datTime
' converted to hours and minutes as a formatted string
' with an optional choice of time separator.
'
' Example:
' datTime: #10:03# + #20:01#
' returns: 30:04
'
' 2005-02-05. Cactus Data ApS, CPH.
Dim strHour As String
Dim strMinute As String
Dim strHourMinute As String
strHour = CStr(Fix(datTime) * 24 + Hour(datTime))
' Add leading zero to minute count when needed.
strMinute = Right("0" & CStr(Minute(datTime)), 2)
strHourMinute = strHour & strSeparator & strMinute
FormatHourMinute = strHourMinute
End Function