2015-09-07 240 views
0

美好的一天!MS ACCESS:計算夜間差分時間(時間範圍)

我有兩個字段,登錄註銷,我需要找出多少小時下夜勤或從晚上10時到早上6點回落。這兩個字段的格式均爲datetime字段。所以如果登錄時間是晚上10點,登出時間是早上7點,那麼應該是8個小時。

我寧願一個查詢,因爲所有其他數據從一個查詢中獲取的 - 時間總計加班等,但我可以用SQL或VB解決方案正常工作。

謝謝!

回答

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.我認爲可能有一個「更清潔」的條件用於測試。基本上這個問題是「登錄和註銷跨越了晚上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()函數。如果您的時間不符合確切的小時數,並且您希望更精確地計算時間差(以分鐘爲單位),那麼可以輕鬆調整此時間。

Sample output

+0

嗨!謝謝!這很好用!我之前做的是在10點之前和6點之後的幾個小時,然後扣除總小時數。它以某種方式工作,但效率不高。這要好得多! –

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 
+0

嗨!謝謝你的回答,但是這給出了從登錄時間到註銷時間的總小時數。 –

+0

不會。它返回夜晚時間。 – Gustav