计算时差超过 24 小时

Posted

技术标签:

【中文标题】计算时差超过 24 小时【英文标题】:Calculating Time Difference Exceeding 24 hours 【发布时间】:2016-10-04 14:57:38 【问题描述】:

我遇到了一个问题,我试图以秒为单位计算时差,然后在报告(访问报告)中,我会将这些秒数相加并将其格式化为 hh:nn:ss。

但是,我收集两个字段之间时间差的计算字段有时会超过 24 小时,因此会忽略时间差。

我使用的是DateDiff函数---DateDiff("s",[BeginningTime],[EndingTime])

遇到时间超过24小时的情况怎么办?

BeginningTime 和 EndingTime 这两个字段以 AM/PM 格式存储。我不认为这应该重要。

【问题讨论】:

您是通过报表页脚中的计算字段进行总计还是使用 VBA? 我只是通过计算字段进行总计。这并不意味着我反对使用 VBA……如果它更容易,我可以做到。 【参考方案1】:

你可以使用这样的函数:

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])

然而(参见 cmets)这个简单的表达式仅对 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。

【讨论】:

仅供参考,当 [BeginningTime] 和/或 [EndingTime] 早于访问日期/时间纪元 (CDate(0)) 时,此函数返回不正确的结果。 是的,它适用于正时间跨度,因此如果 EndingTime 与 StartingTime 的日期不同,则必须包含日期值。 我明白你的意思,但要清楚,[BeginningTime] 和 [EndingTime] 的完全指定的日期/时间值仍然会产生不正确的结果:FormatHourMinute(CDate("1899-12-28 01:00:00")-CDate("1899-12-27 23:00:00")) 返回“46:00”对于“2:00”的实际(正)时间跨度。 (与 1999 年而不是 1899 年的相同日期/时间值的结果进行比较。) 哦,这就是你的意思。但不要责怪函数,因为错误是由以下事实引起的 - 使用表达式中所做的简单减法 - 您只能获得 1899-12-30 之后日期的真实时间跨度。如果您需要像示例中那样的较早日期的时间跨度,请参阅编辑后的答案以了解完成此操作的方法。 我看到一个分心的投票者 - 只是证明日期/时间对许多人来说是困难的事情。不明白的地方请评论,我会解释的。

以上是关于计算时差超过 24 小时的主要内容,如果未能解决你的问题,请参考以下文章

SQL 计算时间差问题,要精确到天小时分钟.

Python:将字符串转换为日期时间,计算时差,选择时差超过3天的行

在 MySQL 中使用 timediff 函数计算 12 小时格式的时差

中国与美国的时差怎么算?

24小时采样差几分钟

SQL 计算时间差问题,要精确到天小时分钟.