MS ACCESS:夜间差异计算小时数(时间范围)

时间:2015-09-07 06:19:04

标签: sql vba ms-access access-vba

美好的一天!

我有两个字段,登录退出,我需要了解夜间差异或晚上10点到早上6点的小时数。这两个字段都格式化为 datetime 字段。因此,如果登录时间是晚上10点,退出时间是早上7点,则应该是8小时。

我更喜欢查询,因为所有其他数据都来自一个查询 - 总时数加班等等。但我可以使用SQL或VB解决方案。

谢谢!

2 个答案:

答案 0 :(得分:1)

当夜间差异适用时,这个相当短的表达式计算它:

iif(
    hour(dateadd("h", 2, Logout)) < 8,
    hour(dateadd("h", 2, Logout)),
    8
) - 
iif(
    hour(dateadd("h", 2, Login)) < 8,
    hour(dateadd("h", 2, Login)),
    0
)

因为我认为您可能有登录/注销对,其中注销在晚上10点开始之前的差异时间,然后您必须将其包装在额外条件下以触发它,否则返回0.我&# 39;我认为可能会有一个更清洁的&#34;用于测试的条件。这个基本上要求&#34;登录和注销是否跨越晚上10点开始时间或登录发生在半夜?&#34;

iif(
    hour(Login) + 2 > hour(dateadd("h", 2, Logout)) or hour(Login) < 6,
    iif(
        hour(dateadd("h", 2, Logout)) < 8,
        hour(dateadd("h", 2, Logout)),
        8
    ) - 
    iif(
        hour(dateadd("h", 2, Login)) < 8,
        hour(dateadd("h", 2, Login)),
        0
    ),
    0
)

所有这些2的字面值都来自于将晚上10点的开始时间转移到午夜的想法,这使得数学更容易。此外,我几乎认为登录/注销总是少于24小时。自从你问了好几个小时后我才使用hour()函数。如果您的时间与精确的小时数不一致,并且您希望更精确地计算时差,例如以分钟为单位,则可以轻松调整。

Sample output

答案 1 :(得分:0)

这在SQL中很难解决。我相信你需要一个像这样的辅助函数:

Public Function TimeNightHours( _
    ByVal StartTime As Date, _
    ByVal EndTime As Date) _
    As Date

    Const NightHoursFirst   As Date = #10:00:00 PM#
    Const NightHoursLast    As Date = #6:00:00 AM#

    Dim NightHours          As Date

    If StartTime = EndTime Then
        ' No hours.
    ElseIf StartTime < EndTime Then
        ' Hours don't cross Midnight.
        If StartTime < NightHoursLast Then
            ' Early night hours exist.
            If EndTime < NightHoursLast Then
                NightHours = EndTime - StartTime
            Else
                NightHours = NightHoursLast - StartTime
            End If
        End If
        If EndTime > NightHoursFirst Then
            ' Late night hours exist.
            If StartTime > NightHoursFirst Then
                NightHours = NightHours + EndTime - StartTime
            Else
                NightHours = NightHours + EndTime - NightHoursFirst
            End If
        End If
    Else
        ' Hours do cross Midnight.
        NightHours = TimeValue(CDate(1 + NightHoursLast - NightHoursFirst))
        If EndTime < NightHoursLast Then
            ' Early night hours exist.
            If StartTime > NightHoursLast Then
                NightHours = NightHours - (NightHoursLast - EndTime)
            Else
                NightHours = NightHours - (StartTime - EndTime)
            End If
        End If
        If StartTime > NightHoursFirst Then
            ' Late night hours exist.
            If EndTime < NightHoursFirst Then
                NightHours = NightHours - (StartTime - NightHoursFirst)
            Else
                NightHours = NightHours - (StartTime - EndTime)
            End If
        End If
    End If

    TimeNightHours = NightHours

End Function