美好的一天!
我有两个字段,登录和退出,我需要了解夜间差异或晚上10点到早上6点的小时数。这两个字段都格式化为 datetime 字段。因此,如果登录时间是晚上10点,退出时间是早上7点,则应该是8小时。
我更喜欢查询,因为所有其他数据都来自一个查询 - 总时数,加班等等。但我可以使用SQL或VB解决方案。
谢谢!
答案 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()
函数。如果您的时间与精确的小时数不一致,并且您希望更精确地计算时差,例如以分钟为单位,则可以轻松调整。
答案 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