【问题标题】:How can I sum a time datatype column in SSRS?如何对 SSRS 中的时间数据类型列求和?
【发布时间】:2019-11-21 07:37:23
【问题描述】:

我在 SSRS 中有一个如下所示的表:

CheckIn     CheckOut      Hours
9:00:00     10:00:00     1:00:00
9:30:00     10:00:00     0:30:00
9:15:00     10:00:00     0:45:00

所以我只想总结小时列,使其看起来像这样

CheckIn     CheckOut      Hours
9:00:00     10:00:00     1:00:00
9:30:00     10:00:00     0:30:00
9:15:00     10:00:00     0:45:00

                       Total Hours
                         2:15:00

我尝试使用这个表达式,但它不起作用

Str(sum(CInt(split(Fields!Hours.Value,":")(0)))
+sum(CInt(split(Fields!Hours.Value,":")(1)))\60)
&":"& CStr(sum(CInt(split(Fields!Hours.Value,":")(1)))
mod 60+sum(CInt(split(Fields!Hours.Value,":")(2)))\60) 
&":"& CStr(sum(CInt(split(Fields!Hours.Value,":")(2))) mod 60)

【问题讨论】:

  • 你试过TimeSpan.FromTicks(Sum(Fields!Hours.Value))
  • @ϻᴇᴛᴀʟ 这很完美,但它只能显示小时数吗?因为在我的报告中,我的时间加起来是“37:34”,它显示“1.13:34:00”是一天零 13 小时
  • 那么你的会议时间呢?假设 02:50 + 23:50?根据表达式,它不会结转额外的分钟数。

标签: sql-server reporting-services reporting


【解决方案1】:

首先是得到总和()

第二个是提取天数乘以24小时,再相加 到小时值。

CInt(split(TimeSpan.FromTicks(Sum(Fields!Hours.Value)), ".")(0)) * 24
    + CInt(split(split(TimeSpan.FromTicks(Sum(Fields!Hours.Value)), ".")(1), ":")(0)) 
& ":" & split(split(TimeSpan.FromTicks(Sum(Fields!Hours.Value)), ".")(1), ":")(1)
& ":" & split(split(TimeSpan.FromTicks(Sum(Fields!Hours.Value)), ".")(2), ":")(1)

【讨论】:

    【解决方案2】:

    在报告的代码部分添加 2 个函数:

    ' I took it here https://www.tek-tips.com/viewthread.cfm?qid=1165634
    Public Function TimeStrToSeconds(ByVal strTime As String) As Integer
            Dim strHours As String
            Dim strMinutes As String
            Dim strSeconds As String
    
            Dim arrTime() As String
    
            arrTime = strTime.Split(":")
    
            strHours = arrTime(0)
            strMinutes = arrTime(1)
            strSeconds = arrTime(2)
    
            TimeStrToSeconds= strHours * 60 * 60
            TimeStrToSeconds+= strMinutes * 60
            TimeStrToSeconds+= strSeconds
    
    
    End Function
    
    ' I took it here http://www.freevbcode.com/ShowCode.asp?ID=638
    Public Function Duration(TotalSeconds As Long, UpFormat As _
        Integer) As String
    
      ' Format = 0, 1, 2
      ' This determines the format of the time to be returned
      ' Type 0: 1d 4h 15m 47s
      ' Type 1: 1 day, 4:15:47
      ' Type 2: 1 day 4hrs 15mins 47secs
      ' Type else: Defaults to type 0
    
      Dim Seconds
      Dim Minutes
      Dim Hours
      Dim Days
      Dim DayString As String
      Dim HourString As String
      Dim MinuteString As String
      Dim SecondString As String
    
      Seconds = Int(TotalSeconds Mod 60)
      Minutes = Int(TotalSeconds \ 60 Mod 60)
      Hours = Int(TotalSeconds \ 3600 Mod 24)
      Days = Int(TotalSeconds \ 3600 \ 24)
    
      Select Case UpFormat
        Case 0
          DayString = "d "
          HourString = "h "
          MinuteString = "m "
          SecondString = "s"
        Case 1
          If Days = 1 Then DayString = " day, " _
          Else: DayString = " days, "
          HourString = ":"
          MinuteString = ":"
          SecondString = ""
        Case 2
          If Days = 1 Then DayString = " day " _
          Else: DayString = " days, "
          If Hours = 1 Then HourString = "hr " _
          Else: HourString = "hrs "
          If Minutes = 1 Then MinuteString = "min " _
          Else: MinuteString = "mins "
          If Seconds = 1 Then SecondString = "sec " _
          Else: SecondString = "secs"
        Case Else
          DayString = "d "
          HourString = "h "
          MinuteString = "m "
          SecondString = "s"
      End Select
    
      Select Case Days
        Case 0
          Duration = Format(Hours, "0") & HourString & _
                Format(Minutes, "00") & MinuteString & _
                 Format(Seconds, "00") & SecondString
        Case Else
          Duration = Days & DayString & _
              Format(Hours, "0") & HourString & Format _
              (Minutes, "00") & MinuteString & _
               Format(Seconds, "00") & SecondString
        End Select
    
    End Function
    

    你的总数:

    =Code.Duration(Sum(Code.TimeStrToSeconds(Fields!Hours.Value)),1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多