VBA: DateDiff Hour закруглен - PullRequest
       13

VBA: DateDiff Hour закруглен

1 голос
/ 07 мая 2011

У меня есть следующая подпрограмма в Access 2003 для возврата истекших часов между двумя полями даты и времени.

Function DateDifferenceHour(dateStart As Date, dateEnd As Date) As String
'Outputs Hours from two dates

Dim age_hour As Double

age_hour = DateDiff("h", dateStart, dateEnd)

DateDifferenceHour = age_hour

End Function

Если у меня есть следующее: DateDifferenceHour("07/23/2005","07/23/2005 7:30:00 PM").
Правильно возвращается 19 часов, но в действительности время составляет 19 часов и 30 минут .

Как я могу изменить его, чтобы оно могло округляться до 20 часов?

Ответы [ 2 ]

3 голосов
/ 07 мая 2011

Редактировать : Моим первоначальным предложением было " Рассчитать разницу в минутах, разделить на 60 и округлить частное до нуля десятичных знаков ".Тем не менее, @ Жан-Франсуа Корбетт показал мне ограничение этого подхода.

? DateDifferenceHour("07/23/2005 7:00:59 PM","07/23/2005 7:30:00 PM")
1

IOW моя первая попытка округлилась с продолжительностью от 29 минут и 1 секунды до 1 часа, что не очень хорошо.Поэтому вместо этого я предлагаю использовать разницу в секундах и делить ее на 3600.

Function DateDifferenceHour2(dateStart As Date, dateEnd As Date) As String
    'Outputs Hours from two dates
    DateDifferenceHour2 = _
        Format(DateDiff("s", dateStart, dateEnd) / 3600, "0")
End Function

? DateDifferenceHour2("07/23/2005 7:00:59 PM","07/23/2005 7:30:00 PM")
0

Все еще остается вопрос о том, какой подход округления вы хотите.

Я выбрал Format (), думая, что вы захотите2,5 часа с округлением до 3.

Функция VBA Round () использует округление до четности, поэтому Round (2.5, 0) даст вам 2.

Мы не знаем, какиеты хочешь;Вы можете сказать нам.Кроме того, dateStart и dateEnd подразумевают, что dateStart не будет больше чем dateEnd.Однако, если это возможно, подумайте, как вы хотите, чтобы отрицательная продолжительность «округлялась» до ближайшего часа.Вот несколько примеров, скопированных из «Немедленного окна».

? Round(-2.5, 0)
-2 
? Round(-1.5, 0)
-2 
? Format(-2.5, "0")
-3
? Format(-1.5, "0")
-2
2 голосов
/ 07 мая 2011

Это работает, без каких-либо неожиданных округлений (кроме точности самого типа Date).

Function DateDifferenceHour(dateStart As Date, dateEnd As Date) As String

    ' Rounds .5's to nearest even integer.
    'DateDifferenceHour = CStr( Round( _
    '    CDbl(dateEnd - dateStart) * 24 ) )

    ' Rounds .5's up. 
    DateDifferenceHour = Format( _
        CDbl(dateEnd - dateStart) * 24, "0" )

End Function

Я поставил два варианта округления, чтобы оно округлялось до целых чисел; выбери свой любимый. Лучше практиковать программирование для явного и прозрачного округления, чем для неявного применения DateDiff его необычного округления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...