我目前在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
因此,我怎样才能使表达式也减去得到所需小计的分钟数和秒数?
答案 0 :(得分:2)
构建大型表达式的更好解决方案是将以下自定义代码添加到报表中:
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
课程将花费秒数并通过调用TimeSpan.FromSeconds
将其转换为时间单位。
您可能想知道为什么我们使用TotalHours
代替Hours
。请记住,TimeSpan小时数基于24小时制,因此除此之外的任何内容都将被视为天。相比之下,TotalHours
如TimeSpan中所述,MSDN文档代表:
以整数小时表示的当前TimeSpan结构的值。
换句话说,它以十进制小时表示整个时间。这与当前表达式计算小时数的方式相当,因此我们在自定义代码中使用Floor(ts.TotalHours)
的原因。
答案 1 :(得分:1)
假设您可以访问数据库,那么在数据库端进行任何复杂的数据处理都会更好。
因此,无论您是在创建数据集,我都会提供一个名为eg的列。 TimeDifference并将其传递给SSRS。
答案 2 :(得分:0)
您的第三个代码示例中的数学有两个方面存在缺陷。首先,您只是减去小时数并完全忽略“分钟和秒”减法。其次,在进行减法之前,你正在计算的小时数,这可能会导致在某些情况下出现一个问题。
要解决您的具体情况,您可以像下面这样修改以下公式:
=(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")
将其分解为组件:
Time_in_default
减去Staffed_Time
,然后确定小时数。Time_in_default
中减去Staffed_Time
并显示分钟和秒数。但是,为了使这更简单,只需使用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")
这不需要任何自定义代码,并且相当容易理解。