2017-02-21 7 views
1

私は開始時間と終了時間の2つのフィールドを持っています。それらの間にスパンが1日以上ある場合、それらはちょうど時間か日時を含んでいます。範囲内の時間の計算方法は?

私は午後6時から午前6時の間の開始と終了の間の何時間を見つけることを試みています。

time_finishedが同じ日になると私には時間が届きますが、他の場合にはどうやって取得するのか苦労しています。

IIf(TimeValue([time_finish])>#6:00:00 PM#,DateDiff('h',#6:00:00 PM#,TimeValue([time_finish])),0) 
+0

削除コメント時間カウント、60による除算を得るために –

答えて

0

私は「普通の」WORKHOURSの作業分を計算し、古い機能を持っている:

Public Function ISO_WorkTimeDiff(_ 
    ByVal datDateTimeFrom As Date, _ 
    ByVal datDateTimeTo As Date, _ 
    Optional ByVal booNoHours As Boolean) _ 
    As Long 

' Purpose: Calculate number of working minutes between date/times datDateTimeFrom and datDateTimeTo. 
' Assumes: 5 or 6 working days per week. Weekend is (Saturday and) Sunday. 
' Returns: "Working minutes". Divide by 60 to obtain working hours. 
' Limitation: Does not count for public holidays. 
' 
' May be freely used and distributed. 
' 2001-06-26. Gustav Brock, Cactus Data ApS, Copenhagen 
' 
' If booNoHours is True, time values are ignored. 

    ' Specify begin and end time of daily working hours. 
    Const cdatWorkTimeStart As Date = #8:00:00 AM# 
    Const cdatWorkTimeStop As Date = #4:00:00 PM# 
    Const cbytWorkdaysOfWeek As Byte = 5 

    Dim bytSunday    As Byte 
    Dim intWeekdayDateFrom As Integer 
    Dim intWeekdayDateTo  As Integer 
    Dim datTimeFrom   As Date 
    Dim datTimeTo    As Date 
    Dim lngDays    As Long 
    Dim lngMinutes   As Long 
    Dim lngWorkMinutesDaily As Long 

    ' No special error handling. 
    On Error Resume Next 

    If DateDiff("n", datDateTimeFrom, datDateTimeTo) <= 0 Then 
    ' Nothing to do. Return zero. 
    Else 

    ' Calculate number of daily "working minutes". 
    lngWorkMinutesDaily = DateDiff("n", cdatWorkTimeStart, cdatWorkTimeStop) 

    ' Find ISO weekday for Sunday. 
    bytSunday = Weekday(vbSunday, vbMonday) 

    ' Find weekdays for the dates. 
    intWeekdayDateFrom = Weekday(datDateTimeFrom, vbMonday) 
    intWeekdayDateTo = Weekday(datDateTimeTo, vbMonday) 

    ' Compensate weekdays' value for non-working days (weekends). 
    intWeekdayDateFrom = intWeekdayDateFrom + (intWeekdayDateFrom = bytSunday) 
    intWeekdayDateTo = intWeekdayDateTo + (intWeekdayDateTo = bytSunday) 

    ' Calculate number of working days between the weeks of the two dates. 
    lngDays = (cbytWorkdaysOfWeek * DateDiff("w", datDateTimeFrom, datDateTimeTo, vbMonday, vbFirstFourDays)) 
    ' Add number of working days between the two weekdays, ignoring number of weeks. 
    lngDays = lngDays + intWeekdayDateTo - intWeekdayDateFrom - (cbytWorkdaysOfWeek * (intWeekdayDateTo < intWeekdayDateFrom)) 

    If Not booNoHours = True Then 
     ' Extract begin and stop hour (time) for the working period. 
     datTimeFrom = TimeSerial(Hour(datDateTimeFrom), Minute(datDateTimeFrom), Second(datDateTimeFrom)) 
     datTimeTo = TimeSerial(Hour(datDateTimeTo), Minute(datDateTimeTo), Second(datDateTimeTo)) 
     ' Adjust times before or after daily working hours to boundaries of working hours. 
     If DateDiff("n", datTimeFrom, cdatWorkTimeStart) > 0 Then 
     datTimeFrom = cdatWorkTimeStart 
     ElseIf DateDiff("n", datTimeFrom, cdatWorkTimeStop) < 0 Then 
     datTimeFrom = cdatWorkTimeStop 
     End If 
     If DateDiff("n", datTimeTo, cdatWorkTimeStart) > 0 Then 
     datTimeTo = cdatWorkTimeStart 
     ElseIf DateDiff("n", datTimeTo, cdatWorkTimeStop) < 0 Then 
     datTimeTo = cdatWorkTimeStop 
     End If 

     ' Calculate number of working minutes between the two days, ignoring number of days. 
     lngMinutes = DateDiff("n", datTimeFrom, datTimeTo) 
    End If 

    ' Calculate number of working minutes between the two days using the workday count. 
    lngMinutes = lngMinutes + (lngDays * lngWorkMinutesDaily) 

    End If 

    ISO_WorkTimeDiff = lngMinutes 

End Function 

しかし、あなたがする必要がありますあなたの場合のように、時間は(もちろん)、停止時間の前にある必要があります開始クロスオーバーに1日追加する:

Const cdatWorkTimeStart As Date = #6:00:00 PM# 
    Const cdatWorkTimeStop As Date = #6:00:00 AM# + 1 

これは動作するようです。

WorkHours = ISO_WorkTimeDiff(DateTimeFrom, DateTimeTo)/60 

もしくは、切り捨て整数カウント用:

WorkHours = ISO_WorkTimeDiff(DateTimeFrom, DateTimeTo) \ 60 
関連する問題