【问题标题】:SSRS Total Time in HHMMSSHHMMSS 中的 SSRS 总时间
【发布时间】:2015-09-09 11:52:21
【问题描述】:

从上图中,我将 HHMMSS 列汇总为 SSRS,表达式如下:

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

如果列中没有空格,则效果很好,但在没有值或空格时会出错。我该如何克服呢? 报告的查询是:

    DECLARE @Table TABLE 
    (
          RowID       INT IDENTITY(1,1) PRIMARY KEY
 , EmpID       INT NOT NULL
 , StartTime   DATETIME NOT NULL DEFAULT('1900/00/00')
 , FinishTime  DATETIME NOT NULL DEFAULT('1900/00/00')
 , JobID       INT NULL
 , IdleTime    INT 
    )

    INSERT INTO @Table(EmpID,StartTime,FinishTime,JobID,IdleTime)
    VALUES (100,'2011-09-08 09:00:03.410','2011-09-08 09:55:18.153',12,1)
         , (100,'2011-09-08 11:55:03.810','2011-09-08 12:30:18.153',12,-1)
         , (101,'2012-10-17 09:19:52.637','2012-10-17 17:19:52.637',15,1)
     , (101,'2012-10-17 12:30:52.637','2012-10-17 13:25:52.637',15,-1)
     , (103,'2012-10-17 09:00:03.410','2012-10-17 16:19:52.637',20,1)
     , (103,'2012-10-17 13:00:03.410','2012-10-17 13:49:52.637',20,-1)
     , (104,'2012-10-17 09:00:03.410','2012-10-17 15:19:52.637',54,1)
     , (104,'2012-10-17 11:00:03.410','2012-10-17 13:19:52.637',54,-1)
     , (105,'2012-10-16 09:00:03.410','2012-10-17 18:19:52.637',56,1)
     , (105,'2012-10-17 13:00:03.410','2012-10-17 14:19:52.637',56,-1)
     , (106,'2012-10-10 09:00:03.310','2012-10-17 15:19:52.637',10,1)
     , (106,'2012-10-17 10:00:03.410','2012-10-17 10:34:52.637',10,-1)
     , (106,'2012-10-17 13:00:03.410','2012-10-17 13:35:52.637',10,-1)
     , (107,'2012-10-17 09:00:03.410','2012-10-17 15:19:52.637',17,1)
     , (108,'2012-10-17 09:00:03.410','2012-10-17 15:19:52.637',19,1)
     , (109,'2012-10-17 09:00:03.410','2012-10-17 18:19:52.637',11,1)
     , (109,'2012-10-17 10:00:03.410','2012-10-17 10:19:52.637',11,-1)
     , (109,'2012-10-17 12:00:03.410','2012-10-17 12:20:52.637',11,-1)
     , (109,'2012-10-18 14:00:03.410','2012-10-18 14:20:08.677',11,-1)
     , (110,'2012-10-17 09:00:03.410','2012-10-17 15:19:52.637',20,1)
         , (101,'2012-10-18 09:19:52.637','2012-10-18 17:19:52.637',15,1)
     , (101,'2012-10-18 12:30:52.637','2012-10-18 13:25:52.637',15,-1)
     , (103,'2012-10-18 09:00:03.410','2012-10-18 16:19:52.637',20,1)
     , (103,'2012-10-18 13:00:03.410','2012-10-18 13:49:52.637',20,-1)
     , (104,'2012-10-18 09:00:03.410','2012-10-18 15:19:52.637',54,1)
     , (104,'2012-10-18 11:00:03.410','2012-10-18 13:19:52.637',54,-1)
     , (105,'2012-10-18 09:00:03.410','2012-10-18 18:19:52.637',56,1)
     , (105,'2012-10-18 13:00:03.410','2012-10-18 14:19:52.637',56,-1)
     , (106,'2012-10-18 09:00:03.310','2012-10-18 15:19:52.637',100,1)
     , (106,'2012-10-18 10:00:03.410','2012-10-18 10:34:52.637',100,-1)
     , (106,'2012-10-18 13:00:03.410','2012-10-18 13:35:52.637',10,-1)
     , (107,'2012-10-18 09:00:03.410','2012-10-18 15:19:52.637',17,1)
     , (108,'2012-10-18 09:00:03.410','2012-10-18 15:19:52.637',19,1)
     , (109,'2012-10-18 09:00:03.410','2012-10-18 18:19:52.637',133,1)
     , (109,'2012-10-18 10:00:03.410','2012-10-18 10:19:52.637',133,-1)
     , (109,'2012-10-18 12:00:03.410','2012-10-18 12:20:52.637',133,-1)
     , (109,'2012-10-18 14:00:03.410','2012-10-18 14:20:08.677',133,-1)
     , (110,'2012-10-18 09:00:03.410','2012-10-18 15:19:52.637',31,1)

     SELECT EmpID
           , CONVERT(VARCHAR(10), StartTime, 103) AS [Date] 
       , CONVERT(VARCHAR(5), StartTime, 108) AS [Time]
       , CONVERT(VARCHAR(10), FinishTime, 103) AS Date_Off 
       , CONVERT(VARCHAR(5), FinishTime, 108) AS Time_Off
       , CASE WHEN IdleTime = -1 THEN '' 
     ELSE CONVERT(VARCHAR(10)
           , DATEADD(SECOND, DATEDIFF(SECOND,StartTime,FinishTime),0), 108)END AS HHMMSS
      , CASE WHEN IdleTime = -1 THEN CONVERT(VARCHAR(10), DATEADD(SECOND, DATEDIFF(SECOND,StartTime,FinishTime),0), 108)
    ELSE '' END AS TrainingTime
    FROM @Table

【问题讨论】:

  • 您使用的是什么版本的 SQL Server 2005/2008/R2/2012?
  • 您使用的是什么版本的报告服务?

标签: reporting-services ssrs-2008 ssrs-2008-r2 reportingservices-2005 ssrs-2012


【解决方案1】:

您收到 #error 是因为您尝试添加带有整数的 varchars(空白/空值)。

而不是空白或 NULLHH:MM:SS 列设为 0:0:0(或 00:00:00)。如果您不想在报告中显示,您可以使用文本框中的隐藏表达式在报告级别将其隐藏。通过此更改,SSRS 将不需要将 varchars 与数字混合,并且您不会收到 #error。

处理这个问题的其他方法是在 SQL 查询本身中处理它。

SELECT EmpID, [Date], [Time],
CASE WHEN ColumnA = 'Training' THEN '00:00:00' ELSE CONVERT(VARCHAR(10), DATEADD(SECOND, DATEDIFF(SECOND,StartTime,FinishTime),0), 108) END AS HHMMSS
,
SUM(IIF (ColumnA='Training',0,DATEDIFF(SECOND, StartTime,FinishTime))) OVER  (PARTITION BY EmpID, [Date]) AS TotalTime
,CONVERT(VARCHAR(10),
DATEADD(SECOND,
    SUM(IIF (ColumnA='Training',0,DATEDIFF(SECOND, StartTime,FinishTime))) OVER  (PARTITION BY EmpID, [Date])
, 108) AS TotalTimeHHMMSS
    FROM ....
    WHERE ....

分区列取决于您如何根据empid, jobid 和其他字段对数据进行分区。 现在您有了以秒为单位的总时间,您可以在 SSRS 或查询中转换它。

【讨论】:

  • 感谢@Anup Agrawal。我试过:[SELECT CASE WHEN ColumnA = 'Training' THEN '00:00:00' ELSE CONVERT(VARCHAR(10), DATEADD(SECOND, DATEDIFF(SECOND,StartTime,FinishTime),0), 108) END AS HHMMSS FROM TableA],但仍然出现错误。
  • SELECT CASE WHEN ColumnA = 'Training' THEN 00:00:00 ELSE CONVERT(VARCHAR(10), DATEADD(SECOND, DATEDIFF(SECOND,StartTime,FinishTime),0), 108) END AS HHMMSS FROM TableA 会在 SSMS 中抛出错误
  • @dLight 对于第二条评论,您在 00:00:00 忘记了单引号。您需要使用'00:00:00'
  • @dLight 您也可以分享您对数据集的完整查询吗?
  • 嗨@dLight我用查询选项更新了我的答案,看看你是否可以做到这一点。我在 SQL 查询本身中添加了组总数。
【解决方案2】:

尝试在下面添加IIF语句:

=iif(IsNothing(Fields!HHMMSS.Value) OR Fields!HHMMSS.Value = "", "",
 CStr(sum(CInt(split(Fields!HHMMSS.Value,":")(0)))
 +sum(CInt(split(Fields!HHMMSS.Value,":")(1)))\60)
   &":"& CStr(sum(CInt(split(Fields!HHMMSS.Value,":")(1)))
  mod 60+sum(CInt(split(Fields!HHMMSS.Value,":")(2)))\60) 
  &":"& CStr(sum(CInt(split(Fields!HHMMSS.Value,":")(2))) mod 60)
)

更新

=iif(Len(Fields!HHMMSS.Value) <= 0, "",
 CStr(sum(CInt(split(Fields!HHMMSS.Value,":")(0)))
 +sum(CInt(split(Fields!HHMMSS.Value,":")(1)))\60)
   &":"& CStr(sum(CInt(split(Fields!HHMMSS.Value,":")(1)))
  mod 60+sum(CInt(split(Fields!HHMMSS.Value,":")(2)))\60) 
  &":"& CStr(sum(CInt(split(Fields!HHMMSS.Value,":")(2))) mod 60)
)

更新 2

=iif(Len(Fields!HHMMSS.Value) <= 0, "",
 CStr(sum(CInt(split(iif(Len(Fields!HHMMSS.Value) <= 0, "", Fields!HHMMSS.Value),":")(0)))
 +sum(CInt(split(iif(Len(Fields!HHMMSS.Value) <= 0, "", Fields!HHMMSS.Value),":")(1)))\60)
   &":"& CStr(sum(CInt(split(iif(Len(Fields!HHMMSS.Value) <= 0, "", Fields!HHMMSS.Value),":")(1)))
  mod 60+sum(CInt(split(iif(Len(Fields!HHMMSS.Value) <= 0, "", Fields!HHMMSS.Value),":")(2)))\60) 
  &":"& CStr(sum(CInt(split(iif(Len(Fields!HHMMSS.Value) <= 0, "", Fields!HHMMSS.Value),":")(2))) mod 60)
)

【讨论】:

  • 谢谢。我试过了,但仍然返回错误。
  • @dLight 再次检查,更新答案。如果UPDATE #1 不起作用,请检查UPDATE #2
  • 谢谢斯坦尼斯洛瓦斯。这么晚才回复很抱歉。我尝试了更新,但仍然无法使其正常工作。会不会是我对HHMMSS 字段的查询? HHMMSS 字段的查询是 `SELECT CASE WHEN ColumnA = 'Training' THEN '' ELSE CONVERT(VARCHAR(10), DATEADD(SECOND, DATEDIFF(SECOND,StartTime,FinishTime),0), 108) END AS HHMMSS FROM表A`
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 2015-01-06
  • 2021-12-01
  • 2011-06-02
  • 1970-01-01
相关资源
最近更新 更多