如何解释此代码中的午夜时间变化?

时间:2016-06-03 15:49:17

标签: sql ms-access time

我需要为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

1 个答案:

答案 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