【问题标题】:How to display a time span of seconds in hh:mm:ss format in Reporting Services如何在 Reporting Services 中以 hh:mm:ss 格式显示以秒为单位的时间跨度
【发布时间】:2011-03-16 21:47:06
【问题描述】:

在 MS Reporting Services 2008 中,我有一个以秒为单位的持续时间字段。有没有一种巧妙的方法可以在报告的组部分中将其转换为 hh:mm:ss 格式?

【问题讨论】:

    标签: reporting-services time ssrs-2008


    【解决方案1】:

    如果你只想显示它,请转换为文本框的值的表达式:

    =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。

    【讨论】:

    • 你的“00:00:00”可以改为0。
    • 它适用于单个时间跨度,但在您希望聚合结果时不起作用
    【解决方案2】:

    如果您需要超过 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)
    

    我希望这对其他人有帮助!

    【讨论】:

      【解决方案3】:

      使用下面的表达式,将粗体替换为包含秒变量的字段。

      =DateAdd(DateInterval.Second, Sum(Fields!totalDuration.Value), CDate("1900-01-01 00:00:00"))

      我总是在文本框属性中应用格式-

      H"h"m"m"s"s" 将显示为“2h 16m 5s”

      【讨论】:

        【解决方案4】:

        使用这样的函数:

        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
        

        【讨论】:

          【解决方案5】:

          我最近使用了 Xan 的想法,由于我拥有的秒数非常大 - 我用完了整数类型限制。因此我设计了一种不同的方法——也许有人会觉得它有用:)

          我需要为小时、分钟和秒创建计算字段 - 使用以下公式:

          • XXXNumberOfHours = int(Fields!TimeInSec.Value/3600)
          • XXXNumberOfMinutes = int((Fields!TimeInSec.Value Mod 3600)/60)
          • XXXNumberOfSeconds = =((Fields!TimeInSec.Value Mod 3600) Mod 60)

          然后我创建了一个表达式以 HH:MM:SS(没有天 - 不需要)格式显示秒数:

          1. (Sum(Fields!LWTNumberOfHours.Value)+int((Sum(Fields!LWTNumberOfMinutes.Value) + int(Sum(Fields!LWTNumberOfSeconds.Value)/60))/60))
          2. &amp; ":" &amp;
          3. right("0" &amp; (Sum(Fields!LWTNumberOfMinutes.Value) +int(Sum(Fields!LWTNumberOfSeconds.Value)/60)) Mod 60, 2)
          4. &amp; ":" &amp;
          5. right("0" &amp; Sum(Fields!LWTNumberOfSeconds.Value) Mod 60, 2)

          在上面的行中,您可以看到第 (1) 行计算小时数,第 (3) 行计算分钟数,第 (5) 行计算秒数。 当然你可以注意到额外的计算是为了从 XXNumberOfSeconds 中得到完整的分钟数,同样适用于 Minutes/Hours。这也可以在计算字段中完成(也许这样做会更正确:)) - 但是我更喜欢使用上述方法。

          通过这种方式,我仍然能够格式化超过整数类型的大量秒数。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-12-18
            • 2012-02-10
            • 1970-01-01
            • 2012-06-16
            • 2023-03-22
            • 1970-01-01
            • 2019-08-29
            • 1970-01-01
            相关资源
            最近更新 更多