1

enter image description hereSSRS Общее время в HHMMSS

Из вышеприведенного изображения, я общую колонку 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 
+0

Какую версию SQL Server вы используете 2005/2008/R2/2012? –

+0

Sql Server 2014 – dLight

+0

Какую версию служб отчетности вы используете? –

ответ

1

Вы получаете #error, потому что вы пытаетесь добавить varchars (blank/nulls) с целыми числами.

Вместо пустого или NULL сделать это HH:MM:SS столбец как 0: 0: 0 (или 00:00:00). Если вы не хотите показывать в отчете, вы можете скрыть его на уровне отчета, используя выражение hide в текстовом поле. С этим изменением 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, либо в запрос.

+0

Благодаря @Anup Agrawal. Я попытался: [ВЫБРАТЬ СЛУЧАЙ КОГДА ColumnA = 'Training' THEN '00: 00: 00 ' \t \t ELSE CONVERT (VARCHAR (10), DATEADD (SECOND, DATEDIFF (SECOND, StartTime, FinishTime), 0), 108) \t \t END AS HHMMSS FROM TableA] и по-прежнему возникают ошибки. – dLight

+0

SELECT, случай, когда Columna = 'Обучение' ТОГДА 00:00:00 \t \t ИНАЧЕ ПРЕОБРАЗОВАНИЯ (VARCHAR (10), DATEADD (ВТОРОЙ, DATEDIFF (ВТОРОЙ, время_запуска, FinishTime), 0), 108) \t \t КОНЕЦ ЧЧММСС FROM TableA выдает ошибку в SSMS – dLight

+0

@dLight Для второго комментария вы забыли одинарные кавычки в 00:00:00. Вам нужно использовать '' 00: 00: 00'' –

1

Попробуйте добавить 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) 
) 

UPDATE

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

UPDATE 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) 
) 
+0

Спасибо. Я попробовал это и все еще получаю ошибку. – dLight

+0

@dLight Проверьте снова, обновленный ответ. Если 'UPDATE # 1' не работает, отметьте' UPDATE # 2' –

+0

Спасибо Stanislovas. Извините за задержку с ответом. Я попробовал обновление и все еще не мог заставить его работать. Может быть, это мой запрос для поля «HHMMSS»? Запрос для поля 'HHMMSS':' SELECT CASE WHEN ColumnA = 'Training' THEN '' \t \t ELSE CONVERT (VARCHAR (10), DATEADD (SECOND, DATEDIFF (SECOND, StartTime, FinishTime), 0), 108) \t \t END AS HHMMSS FROM TableA' – dLight

Смежные вопросы