在MS Reporting Services 2008中,我有一个字段,其持续时间存储为秒。是否有一种灵活的方式可以在报告的组部分中将其转换为hh:mm:ss格式?
答案 0 :(得分:21)
如果您只想显示它,请在表达式中转换文本框的值:
=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。
答案 1 :(得分:13)
如果您需要工作时间超过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)
我希望这有助于其他人!
答案 2 :(得分:2)
使用下面的表达式,将粗体替换为包含seconds变量的字段。
= DateAdd(DateInterval.Second, Sum(Fields!totalDuration.Value),CDate(“1900-01-01 00:00:00”))
我总是在文本框属性中应用格式化 -
H“h”m“m”s“s” 将显示为“2h 16m 5s”
答案 3 :(得分:1)
使用这样的函数:
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
答案 4 :(得分:0)
我最近使用过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)行计算分钟数,第(3)行计算秒数。 当然,您可以注意到,进行了额外的计算以获得XXNumberOfSeconds的完整分钟数,同样适用于Minutes / Hours。这也可以在计算字段中完成(也许这样做甚至更合适:)) - 但我更喜欢使用上述方法。
这样我仍然可以格式化超过整数类型的非常大的秒数。