2016-10-04 6 views
2

У меня возникла проблема, когда я пытаюсь вычислить разницу во времени в секундах, а затем в отчете (отчеты о доступе). Я буду суммировать эти секунды и форматировать их в hh: nn: ss.Вычисление разницы во времени Превышение 24 часов

Однако мое расчетное поле, которое собирает разницу во времени между двумя полями, иногда превышает 24 часа и, таким образом, отбрасывает разницу во времени.

Я использую функцию DateDiff --- DATEDIFF ("s", [BeginningTime], [EndingTime])

Что я должен делать, когда речь идет о тех случаях, когда время превышает 24 часа?

Два поля: BeginningTime и EndingTime хранятся в формате AM/PM. Я не думаю, что это должно иметь значение.

+0

Вы просто делаете итоговые значения через вычисленные поля в нижнем колонтитуле вашего отчета или используете VBA? – dbmitch

+0

Я просто делаю итоги по вычисленным полям. Это не значит, что я против использования VBA ... Я могу сделать это, если это будет проще. – Jbrady90

ответ

2

Вы можете использовать функцию следующим образом:

Public Function FormatHourMinute(_ 
    ByVal datTime As Date, _ 
    Optional ByVal strSeparator As String = ":") _ 
    As String 

' Returns count of days, hours and minutes of datTime 
' converted to hours and minutes as a formatted string 
' with an optional choice of time separator. 
' 
' Example: 
' datTime: #10:03# + #20:01# 
' returns: 30:04 
' 
' 2005-02-05. Cactus Data ApS, CPH. 

    Dim strHour  As String 
    Dim strMinute  As String 
    Dim strHourMinute As String 

    strHour = CStr(Fix(datTime) * 24 + Hour(datTime)) 
    ' Add leading zero to minute count when needed. 
    strMinute = Right("0" & CStr(Minute(datTime)), 2) 
    strHourMinute = strHour & strSeparator & strMinute 

    FormatHourMinute = strHourMinute 

End Function 

и это выражение как ControlSource для текстового поля:

=FormatHourMinute([EndingTime]-[BeginningTime]) 

Однако (см комментарии) это простое выражение справедливо только для дат положительного числового значения, которые являются датами после 1899-12-30.

Чтобы покрыть все даты, вам нужен правильный метод для вычисления отрезок времени, и что можно сделать с помощью этой функции:

' Converts a date value to a timespan value. 
' Useful only for date values prior to 1899-12-30 as 
' these have a negative numeric value. 
' 
' 2015-12-15. Gustav Brock, Cactus Data ApS, CPH. 
' 
Public Function DateToTimespan(_ 
    ByVal Value As Date) _ 
    As Date 

    ConvDateToTimespan Value 

    DateToTimespan = Value 

End Function 


' Converts a date value by reference to a linear timespan value. 
' Example: 
' 
' Date  Time Timespan  Date 
' 19000101 0000 2    2 
' 
' 18991231 1800 1,75   1,75 
' 18991231 1200 1,5   1,5 
' 18991231 0600 1,25   1,25 
' 18991231 0000 1    1 
' 
' 18991230 1800 0,75   0,75 
' 18991230 1200 0,5   0,5 
' 18991230 0600 0,25   0,25 
' 18991230 0000 0    0 
' 
' 18991229 1800 -0,25   -1,75 
' 18991229 1200 -0,5   -1,5 
' 18991229 0600 -0,75   -1,25 
' 18991229 0000 -1   -1 
' 
' 18991228 1800 -1,25   -2,75 
' 18991228 1200 -1,5   -2,5 
' 18991228 0600 -1,75   -2,25 
' 18991228 0000 -2   -2 
' 
' 2015-12-15. Gustav Brock, Cactus Data ApS, CPH. 
' 
Public Sub ConvDateToTimespan(_ 
    ByRef Value As Date) 

    Dim DatePart As Double 
    Dim TimePart As Double 

    If Value < 0 Then 
     ' Get date (integer) part of Value shifted one day 
     ' if a time part is present as -Int() rounds up. 
     DatePart = -Int(-Value) 
     ' Retrieve and reverse time (decimal) part. 
     TimePart = DatePart - Value 
     ' Assemble date and time part to return a timespan value. 
     Value = CDate(DatePart + TimePart) 
    Else 
     ' Positive date values are identical to timespan values by design. 
    End If 

End Sub 

Тогда ваше выражение будет выглядеть так:

=FormatHourMinute(DateToTimespan([EndingTime])-DateToTimespan([BeginningTime])) 

который для значений примера Gord, #1899-12-28 01:00:00# и #1899-12-27 23:00:00#, вернется 2:00.

+0

FYI, эта функция возвращает неверные результаты, когда [BeginningTime] и/или [EndingTime] предшествуют эпохе Access Date/Time ('CDate (0)'). –

+0

Да, он предназначен для положительного периода времени, поэтому значения даты должны быть включены, если EndingTime не совпадает с датой BeginningTime. – Gustav

+0

Я получаю то, что вы говорите, но чтобы быть ясным, полностью заданные значения даты/времени для [BeginningTime] и [EndingTime] могут по-прежнему выдавать неверные результаты: 'FormatHourMinute (CDate (« 1899-12-28 01:00:00 » ") -CDate (" 1899-12-27 23:00:00 "))' возвращает "46:00" для фактического (положительного) временного интервала «2:00». (Сравните с результатами тех же значений даты и времени за 1999 год вместо 1899 года.) –

Смежные вопросы