【发布时间】:2011-03-16 21:47:06
【问题描述】:
在 MS Reporting Services 2008 中,我有一个以秒为单位的持续时间字段。有没有一种巧妙的方法可以在报告的组部分中将其转换为 hh:mm:ss 格式?
【问题讨论】:
标签: reporting-services time ssrs-2008
在 MS Reporting Services 2008 中,我有一个以秒为单位的持续时间字段。有没有一种巧妙的方法可以在报告的组部分中将其转换为 hh:mm:ss 格式?
【问题讨论】:
标签: reporting-services time ssrs-2008
如果你只想显示它,请转换为文本框的值的表达式:
=Format(DateAdd("s", Fields!MySecondsField.Value, "00:00:00"), "HH:mm:ss")
如果您想对其进行计算,请将秒数转换为数据集中的 DateTime。使用 SQL:
SELECT DATEADD(ss, MySecondsField, '1900-01-01') AS SecondsAsDateTime
FROM TimeTable
在 Linq 中是这样的:
var qry = from Q in t.TimeList
select new
{
SecondsAsDateTime = DateTime.Today.AddSeconds(Q.MySecondsField)
};
然后您可以将其格式化为正常的 DateTime。
【讨论】:
如果您需要超过 24 小时的工作时间(Chris Latta 的解决方案将在这些情况下进行环绕),那么有几个解决方案。
简单公式
如果您只想在字段上使用公式,例如 this thread 中的以下公式,(这也链接回这个问题)!
=int(sum(Fields!Sec_Online.Value)/3600) & ":" & int((sum(Fields!Sec_Online.Value) Mod 3600)/60) & ":" & (sum(Fields!Sec_Online.Value) Mod 3600) Mod 60
如果您需要将值填充为 2 个字符,您可以在每个子部分周围加上 RIGHT("0" & {X}, 2),其中 {x} 表示上述公式中的单个计算之一。
代码背后
在这个线程中也建议的另一种方法是使用TimeSpan.FromSeconds(doc),在这个blog 上有一个实现,使用报告后面的自定义代码。
我最终使用了自定义代码方法(因为我有很多字段共享此方法),并将它与更像第一种方法的方法相结合,因为我不希望几天开始出现,我只想将小时数计算得更大大于 23。
我在报告中添加了一些custom code,如下所示,它将所有值填充到至少 2 个字符,并允许小时数到小时数 > 23。
Public Function ConvertSecondsToHourMinSec(ByVal intTotalSeconds) As String
Dim hours As String =INT(intTotalSeconds/3600)
If Len(hours) < 2 Then
hours = RIGHT(("0" & hours), 2)
End If
Dim mins As String = RIGHT("0" & INT((intTotalSeconds MOD 3600)/60), 2)
Dim secs AS String = RIGHT("0" & ((intTotalSeconds MOD 3600) MOD 60), 2)
ConvertSecondsToHourMinSec = hours & ":" & mins & ":" & secs
End Function
然后从问题中的每个单元格中调用它,如下所示:
=code.ConvertSecondsToHourMinSec(Fields!MyField.Value)
我希望这对其他人有帮助!
【讨论】:
使用下面的表达式,将粗体替换为包含秒变量的字段。
=DateAdd(DateInterval.Second, Sum(Fields!totalDuration.Value), CDate("1900-01-01 00:00:00"))
我总是在文本框属性中应用格式-
H"h"m"m"s"s" 将显示为“2h 16m 5s”
【讨论】:
使用这样的函数:
Public Function ConvertTsToHMS(myValue As long) As String
'Dim ts as TimeSpan = TimeSpan.FromTicks(myValue)
Dim ts as TimeSpan = TimeSpan.FromSeconds(myValue)
return Int(ts.TotalHours).ToString("00") + ":" + Int(ts.Minutes).ToString("00") + ":" + ts.Seconds.ToString("00")
End Function
【讨论】:
我最近使用了 Xan 的想法,由于我拥有的秒数非常大 - 我用完了整数类型限制。因此我设计了一种不同的方法——也许有人会觉得它有用:)
我需要为小时、分钟和秒创建计算字段 - 使用以下公式:
然后我创建了一个表达式以 HH:MM:SS(没有天 - 不需要)格式显示秒数:
(Sum(Fields!LWTNumberOfHours.Value)+int((Sum(Fields!LWTNumberOfMinutes.Value) + int(Sum(Fields!LWTNumberOfSeconds.Value)/60))/60))
& ":" &
right("0" & (Sum(Fields!LWTNumberOfMinutes.Value) +int(Sum(Fields!LWTNumberOfSeconds.Value)/60)) Mod 60, 2)
& ":" & right("0" & Sum(Fields!LWTNumberOfSeconds.Value) Mod 60, 2)在上面的行中,您可以看到第 (1) 行计算小时数,第 (3) 行计算分钟数,第 (5) 行计算秒数。 当然你可以注意到额外的计算是为了从 XXNumberOfSeconds 中得到完整的分钟数,同样适用于 Minutes/Hours。这也可以在计算字段中完成(也许这样做会更正确:)) - 但是我更喜欢使用上述方法。
通过这种方式,我仍然能够格式化超过整数类型的大量秒数。
【讨论】: