Рассчитать сумму раз - PullRequest
       12

Рассчитать сумму раз

1 голос
/ 21 декабря 2011

Привет! Я создаю отчет RDLC для системы управления посещаемостью.В моем отчете я хочу получить сумму WorkedHours.

Я хочу именно этот вывод

EmployeeId EmployeeName  WorkedHours
1             ABC        04:00:25
2             XYZ        07:23:01
3             PQR        11:02:15

ТАК, я хочу отображать итоговые данные всех 3 сотрудников в конце отчета в RDLC.

нравится Всего: 22: 25: 41

Ответы [ 2 ]

0 голосов
/ 22 декабря 2011
declare @T table
(
  EmployeeId int,
  EmployeeName varchar(10),
  WorkedHours varchar(8)
)

insert into @T
select 1, 'ABC', '04:00:02' union all
select 2, 'XYZ', '07:23:01' union all
select 3, 'PQR', '11:02:15'

select right(100+T2.hh, 2)+':'+right(100+T2.mm, 2)+':'+right(100+T2.ss, 2) as TotalHours
from (
      select dateadd(second, sum(datediff(second, 0, cast(WorkedHours as datetime))), 0) as WorkedSum
      from @T 
     ) as T1
cross apply (select datediff(hour, 0, T1.WorkedSum) as hh, 
                    datepart(minute, T1.WorkedSum) as mm, 
                    datepart(second, T1.WorkedSum) as ss) as T2
  1. Преобразовать WorkedHours в datetime
  2. Рассчитать количество секунд с 1900-01-01T00: 00: 00
  3. Сумма секунд для всех строк
  4. Преобразование секунд в дату и время
  5. Используйте datediff для вычисления количества часов
  6. Используйте datepart для получения минут и секунд
  7. Создайте полученную строку и используйте right(100+T...) добавить 0 перед значением, если это необходимо.

Часть cross apply ... не требуется.Я добавил это, чтобы сделать код более понятным.Вы можете использовать выражения в cross apply непосредственно в списке полей, если хотите.

0 голосов
/ 21 декабря 2011

Попробуйте это

select EmpId,In_duration,out_duration,
    datediff(mi,in_duration,out_duration) as Diff_mins
from table

первый параметр в DateDiff - это mi (минуты).Если вы посмотрите dateDiff в документации, вы увидите другие варианты.Пример ниже показывает разницу в часах, минутах и ​​секундах в виде строки.

select   
 LTRIM(STR(DATEDIFF(mi,in_duration,out_duration) /60))+':'+
 LTRIM(STR(DATEDIFF(mi,in_duration,out_duration) %60))+':'+
 LTRIM(STR(DATEDIFF(ss,in_duration,out_duration) -   
          (DATEDIFF(ss,in_duration,out_duration)/60)*60))
as diff
...