2011-12-21 175 views
1

嗨我正在为考勤管理系统创建一个RDLC报表。在我的报告中,我想总和WorkedHours计算时间总和

正是我想要这个输出

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

,所以我想在RDLC报告末尾显示所有总有3名员工。

喜欢Total:22时二十五分41秒

+1

请提供有关您的数据库架构及其中包含的数据的更多信息。 – 2011-12-21 11:37:43

+0

请显示您当前的sql。 – Zohaib 2011-12-21 11:38:36

+1

以表格的形式显示! – 2011-12-21 11:43:45

回答

0

试试这个

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

我想在小时:小时:秒,然后总和所有小时:分钟:秒的差异。 – forum 2011-12-21 11:52:29

+0

其工作..谢谢很多... @ Sparky – forum 2011-12-21 12:52:50

+0

我如何总结RDLC报告中的差异? – forum 2011-12-21 13:00:25

0
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. 秒转换为datetime
  5. 使用datediff来计算小时数
  6. 使用datepart分钟和秒
  7. 生成结果字符串并使用right(100+T...)在值之前添加0如果有必要。

cross apply ...部分没有必要。我补充说为了使代码更清晰。如果您愿意,可以直接在字段列表中使用cross apply中的表达式。

+0

我该如何做RDLC报告中totalworkedhour的总和? totalworkedhour类型是varchar..totalworkedhour就像是04:13:00 .. – forum 2011-12-23 09:19:28