【问题标题】:Calculate Sum of times计算总和
【发布时间】:2012-01-25 05:23:42
【问题描述】:

您好,我正在为考勤管理系统创建 RDLC 报告。在我的报告中,我想总计WorkedHours

我想要这个输出

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

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

点赞总数:22:25:41

【问题讨论】:

  • 请提供有关您的数据库架构和其中包含的数据的更多信息。
  • 请显示你当前的sql。
  • 如果总数 > 24 小时怎么办。当然,在 SQL 方面,只有一个 datetime 数据类型,它期望使用一天中的时间,而不是时间跨度的持续时间。
  • 不管总数是 > 24..我只想要该列的总数..WorkedHours 字段类型是 VARCHAR。
  • 您将问题更改为 计算时间总和,现在回答两次之间的差异,这是您之前的问题,没有任何意义。为什么你不能只问一个新的问题?

标签: sql sql-server-2005 reporting-services rdlc


【解决方案1】:
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 转换为日期时间
  2. 计算自 1900-01-01T00:00:00 以来的秒数
  3. 对所有行的秒数求和
  4. 将秒转换为日期时间
  5. 使用datediff计算小时数
  6. 使用datepart 获取分钟和秒数
  7. 构建生成的字符串并在必要时使用right(100+T...) 在值前添加0

cross apply ... 部分不是必需的。我添加了它以使代码更清晰。如果您愿意,可以直接在字段列表中使用cross apply 中的表达式。

【讨论】:

  • 如何在 RDLC 报告中计算总工作时间的总和..? totalworkedhour 类型是 varchar..totalworkedhour 就像 04:13:00..
【解决方案2】:

试试这个

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

【讨论】:

  • 我想要 Hour:Min:sec 中的差异,然后是所有 Hour:Min:sec 的总和。
  • RDLC 报告中的差异总和如何?
  • 选择 LTRIM(STR(Sum(mi,EmployeeTempAttendanceDetail.TotalEmpWorkedHrs) /60))+':'+ LTRIM(STR(Sum(mi,EmployeeTempAttendanceDetail.TotalEmpWorkedHrs) %60))+':' + LTRIM(STR(Sum(ss,EmployeeTempAttendanceDetail.TotalEmpWorkedHrs) - (Sum(ss,EmployeeTempAttendanceDetail.TotalEmpWorkedHrs)/60)*60)) 作为差异
  • 我想总结一下这个 EmployeeTempAttendanceDetail.TotalEmpWorkedHrs 我该如何实现?
  • 不确定您的意思,报告末尾的单行带有总和?我会在报告中添加一列,包含总秒数的差异,然后对这一行求和,并使用上面的格式将这些秒数的总和转换为 hh:mm:dd 格式
猜你喜欢
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
相关资源
最近更新 更多