如何在 SSRS 中将这两个时间值完全减去时间?
How can get a full subtraction of time of these two time values in SSRS?
我目前在 SSRS 的两个单独表达式中有两个时间值,我想从另一个中减去一个,得到一个子总时间。
目前值1为163:02:38,表达式如下:
=System.Math.Floor(Sum(Fields!Staffed_Time.Value) / 3600) & ":" & Microsoft.VisualBasic.Strings.Format(Microsoft.VisualBasic.DateAndTime.DateAdd("s", Sum(Fields!Staffed_Time.Value), "00:00"), "mm:ss")
而值 2 是 5:12:46
=System.Math.Floor(Sum(Fields!Time_in_Default.Value) / 3600) & ":" & Microsoft.VisualBasic.Strings.Format(Microsoft.VisualBasic.DateAndTime.DateAdd("s", Sum(Fields!Time_in_Default.Value), "00:00"), "mm:ss")
意思是我想要的小计是157:49:52
现在当我使用这个表达式时
=(System.Math.Floor(Sum(Fields!Staffed_Time.Value) / 3600) - System.Math.Floor(Sum(Fields!Time_in_Default.Value) / 3600)) & ":" & Microsoft.VisualBasic.Strings.Format(Microsoft.VisualBasic.DateAndTime.DateAdd("s", Sum(Fields!Staffed_Time.Value), "00:00"), "mm:ss")
它只减去小时值,在这种情况下会删除 5 小时,因此只给我留下 158:02:38
的小计
因此,我怎样才能让表达式也减去分钟和秒以获得所需的小计?
构建大型表达式的更好解决方案是将以下自定义代码添加到您的报告中:
Public Function ConvertSecondsToTime(seconds As Integer) As String
Dim ts as TimeSpan = TimeSpan.FromSeconds(seconds)
return Floor(ts.TotalHours).ToString() + ":" + ts.Minutes.ToString() + ":" + ts.Seconds.ToString()
End Function
并在表达式中使用自定义代码,如下所示:
=code.ConvertSecondsToTime(Sum(Fields!Staffed_Time.Value) - Sum(Fields!Time_in_Default.Value))
您的两个字段以 秒 表示,因此,与其分别计算和减去每个时间单位(小时、分钟和秒)并应用自定义格式,不如减去秒(在给定的 157:49:52 示例中为 568192 秒),然后应用自定义格式。
TimeSpan
class 将花费秒数并通过调用 TimeSpan.FromSeconds
.
将其转换为时间单位
您可能想知道为什么我们使用 TotalHours
而不是 Hours
。请记住,TimeSpan 小时数是基于 24 小时制的,因此超出该时间范围的任何时间都将被视为 天 。相比之下,TotalHours
如 TimeSpan MSDN 文档中所述代表:
the value of the current TimeSpan structure expressed in whole and fractional hours.
换句话说,它代表整个时间,以十进制表示。这与您当前的表达式计算小时数的方式相当,因此我们在自定义代码中使用 Floor(ts.TotalHours)
。
假设您可以访问数据库,您最好在数据库端处理任何复杂的数据。
- 开发速度更快,调试更容易。
- 假设您通过存储过程呈现数据或查看它比编译时 运行 更快。
- 将来更容易管理对架构的更改。
- 视图或存储过程(即您的计算)可以被其他人使用。
因此,无论您如何创建数据集,我都会提供一个名为例如的专栏。 TimeDifference 并将其传递给 SSRS。
您的第三个代码示例中的数学在两个方面存在缺陷。首先,您只是减去小时数,完全忽略 "minutes and seconds" 减法。其次,您在 之前 进行减法运算,这在某些情况下可能会导致差一问题。
要解决您的特定情况,您可以像这样修正以下公式:
=(System.Math.Floor((Sum(Fields!Staffed_Time.Value) - Sum(Fields!Time_in_Default.Value)) / 3600) & ":" & Microsoft.VisualBasic.Strings.Format(Microsoft.VisualBasic.DateAndTime.DateAdd("s", Sum(Fields!Staffed_Time.Value) - Sum(Fields!Time_in_Default.Value), "00:00"), "mm:ss")
将其分解为组件:
- 从
Staffed_Time
中减去 Time_in_default
和 然后 确定小时数。
Staffed_Time
减去Time_in_default
,显示分秒。
但是,为了使这更简单,只需对整篇文章使用 VisualBasic 的 Strings.Format
并完全避免数学运算:
=Microsoft.VisualBasic.Strings.Format(Microsoft.VisualBasic.DateAndTime.DateAdd("s", Sum(Fields!Staffed_Time.Value) - Sum(Fields!Time_in_Default.Value), "00:00"), "HH:mm:ss")
不需要任何自定义代码,而且相当容易理解。
我目前在 SSRS 的两个单独表达式中有两个时间值,我想从另一个中减去一个,得到一个子总时间。
目前值1为163:02:38,表达式如下:
=System.Math.Floor(Sum(Fields!Staffed_Time.Value) / 3600) & ":" & Microsoft.VisualBasic.Strings.Format(Microsoft.VisualBasic.DateAndTime.DateAdd("s", Sum(Fields!Staffed_Time.Value), "00:00"), "mm:ss")
而值 2 是 5:12:46
=System.Math.Floor(Sum(Fields!Time_in_Default.Value) / 3600) & ":" & Microsoft.VisualBasic.Strings.Format(Microsoft.VisualBasic.DateAndTime.DateAdd("s", Sum(Fields!Time_in_Default.Value), "00:00"), "mm:ss")
意思是我想要的小计是157:49:52
现在当我使用这个表达式时
=(System.Math.Floor(Sum(Fields!Staffed_Time.Value) / 3600) - System.Math.Floor(Sum(Fields!Time_in_Default.Value) / 3600)) & ":" & Microsoft.VisualBasic.Strings.Format(Microsoft.VisualBasic.DateAndTime.DateAdd("s", Sum(Fields!Staffed_Time.Value), "00:00"), "mm:ss")
它只减去小时值,在这种情况下会删除 5 小时,因此只给我留下 158:02:38
的小计因此,我怎样才能让表达式也减去分钟和秒以获得所需的小计?
构建大型表达式的更好解决方案是将以下自定义代码添加到您的报告中:
Public Function ConvertSecondsToTime(seconds As Integer) As String
Dim ts as TimeSpan = TimeSpan.FromSeconds(seconds)
return Floor(ts.TotalHours).ToString() + ":" + ts.Minutes.ToString() + ":" + ts.Seconds.ToString()
End Function
并在表达式中使用自定义代码,如下所示:
=code.ConvertSecondsToTime(Sum(Fields!Staffed_Time.Value) - Sum(Fields!Time_in_Default.Value))
您的两个字段以 秒 表示,因此,与其分别计算和减去每个时间单位(小时、分钟和秒)并应用自定义格式,不如减去秒(在给定的 157:49:52 示例中为 568192 秒),然后应用自定义格式。
TimeSpan
class 将花费秒数并通过调用 TimeSpan.FromSeconds
.
您可能想知道为什么我们使用 TotalHours
而不是 Hours
。请记住,TimeSpan 小时数是基于 24 小时制的,因此超出该时间范围的任何时间都将被视为 天 。相比之下,TotalHours
如 TimeSpan MSDN 文档中所述代表:
the value of the current TimeSpan structure expressed in whole and fractional hours.
换句话说,它代表整个时间,以十进制表示。这与您当前的表达式计算小时数的方式相当,因此我们在自定义代码中使用 Floor(ts.TotalHours)
。
假设您可以访问数据库,您最好在数据库端处理任何复杂的数据。
- 开发速度更快,调试更容易。
- 假设您通过存储过程呈现数据或查看它比编译时 运行 更快。
- 将来更容易管理对架构的更改。
- 视图或存储过程(即您的计算)可以被其他人使用。
因此,无论您如何创建数据集,我都会提供一个名为例如的专栏。 TimeDifference 并将其传递给 SSRS。
您的第三个代码示例中的数学在两个方面存在缺陷。首先,您只是减去小时数,完全忽略 "minutes and seconds" 减法。其次,您在 之前 进行减法运算,这在某些情况下可能会导致差一问题。
要解决您的特定情况,您可以像这样修正以下公式:
=(System.Math.Floor((Sum(Fields!Staffed_Time.Value) - Sum(Fields!Time_in_Default.Value)) / 3600) & ":" & Microsoft.VisualBasic.Strings.Format(Microsoft.VisualBasic.DateAndTime.DateAdd("s", Sum(Fields!Staffed_Time.Value) - Sum(Fields!Time_in_Default.Value), "00:00"), "mm:ss")
将其分解为组件:
- 从
Staffed_Time
中减去Time_in_default
和 然后 确定小时数。 Staffed_Time
减去Time_in_default
,显示分秒。
但是,为了使这更简单,只需对整篇文章使用 VisualBasic 的 Strings.Format
并完全避免数学运算:
=Microsoft.VisualBasic.Strings.Format(Microsoft.VisualBasic.DateAndTime.DateAdd("s", Sum(Fields!Staffed_Time.Value) - Sum(Fields!Time_in_Default.Value), "00:00"), "HH:mm:ss")
不需要任何自定义代码,而且相当容易理解。