计算时差超过 24 小时
Calculating Time Difference Exceeding 24 hours
我遇到一个问题,我试图以秒为单位计算时差,然后在报告(访问报告)中我将对这些秒数求和并将其格式化为 hh:nn:ss。
但是,我的计算字段收集了两个字段之间的时间差,有时会超过 24 小时,从而忽略了时间差。
我正在使用 DateDiff 函数 --- DateDiff("s",[BeginningTime],[EndingTime])
遇到超过24小时的情况怎么办?
BeginningTime和EndingTime这两个字段以AM/PM格式存储。不过我认为这不重要。
您可以使用这样的函数:
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])
However(见评论)这个简单的表达式只对 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#
,将 return 2:00.
我遇到一个问题,我试图以秒为单位计算时差,然后在报告(访问报告)中我将对这些秒数求和并将其格式化为 hh:nn:ss。
但是,我的计算字段收集了两个字段之间的时间差,有时会超过 24 小时,从而忽略了时间差。
我正在使用 DateDiff 函数 --- DateDiff("s",[BeginningTime],[EndingTime])
遇到超过24小时的情况怎么办?
BeginningTime和EndingTime这两个字段以AM/PM格式存储。不过我认为这不重要。
您可以使用这样的函数:
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])
However(见评论)这个简单的表达式只对 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#
,将 return 2:00.