美好的一天!MS ACCESS:計算夜間差分時間(時間範圍)
我有兩個字段,登錄和註銷,我需要找出多少小時下夜勤或從晚上10時到早上6點回落。這兩個字段的格式均爲datetime字段。所以如果登錄時間是晚上10點,登出時間是早上7點,那麼應該是8個小時。
我寧願一個查詢,因爲所有其他數據從一個查詢中獲取的 - 時間總計,加班等,但我可以用SQL或VB解決方案正常工作。
謝謝!
美好的一天!MS ACCESS:計算夜間差分時間(時間範圍)
我有兩個字段,登錄和註銷,我需要找出多少小時下夜勤或從晚上10時到早上6點回落。這兩個字段的格式均爲datetime字段。所以如果登錄時間是晚上10點,登出時間是早上7點,那麼應該是8個小時。
我寧願一個查詢,因爲所有其他數據從一個查詢中獲取的 - 時間總計,加班等,但我可以用SQL或VB解決方案正常工作。
謝謝!
當夜班適用那麼這個相當短的表達式計算它:
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.我認爲可能有一個「更清潔」的條件用於測試。基本上這個問題是「登錄和註銷跨越了晚上10點的開始時間或登錄是在半夜嗎?」
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()
函數。如果您的時間不符合確切的小時數,並且您希望更精確地計算時間差(以分鐘爲單位),那麼可以輕鬆調整此時間。
這在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
嗨!謝謝你的回答,但是這給出了從登錄時間到註銷時間的總小時數。 –
不會。它返回夜晚時間。 – Gustav
嗨!謝謝!這很好用!我之前做的是在10點之前和6點之後的幾個小時,然後扣除總小時數。它以某種方式工作,但效率不高。這要好得多! –