SUM 小时和分钟 SQL

Posted

技术标签:

【中文标题】SUM 小时和分钟 SQL【英文标题】:SUM Hour and Minutes SQL 【发布时间】:2016-09-06 04:36:56 【问题描述】:

美好的一天,我试图总结小时和分钟。但现在我只能总结the hour part

这是我的查询。是的,当我将问题放入 *** 时,我得到了这个查询

select 
    a.Nip, b.FullName, c.attendancedate, c.inTime, c.OutTime,
    DATEPART(wk, c.attendanceDate) week, 
    case 
       when DATEADD(HOUR, -8, OutTime) <= InTime then '00:00' 
       else CONVERT(VARCHAR(5),DATEADD(HOUR, -8, OutTime - InTime), 108) 
    end AS total  
from 
    DinasHoDetail a 
left join 
    Employee b on a.Nip = b.Nip
left join 
    DinasHoHeader d on a.KodeDinasHeader = d.KodeDinasHeader
left join 
    attendance c on a.Nip = c.Nip and attendancedate between d.startdate and d.enddate
        where a.KodeDinasHeader = 'DN0000001' and b.nip = '1602744'

从我上面的查询中我得到了这个结果

所以,从结果中可以看出。有一个名为 week 的 col。所以我试图按周总结每个total 组。这是查询

select Nip,sum(ro) achieve,FullName 
from( 
    select a.Nip,b.FullName,DATEPART( wk, c.attendanceDate) week, 
sum(case when DATEADD(HOUR, -8, OutTime) <=InTime then 0 else DATEDIFF(HOUR, InTime, OutTime) - 8 end)/8 AS RO 
from DinasHoDetail a 
    left join Employee b on a.Nip = b.Nip 
    left join DinasHoHeader d on a.KodeDinasHeader = d.KodeDinasHeader 
    left join attendance c on a.Nip =c.Nip and attendancedate between d.startdate and d.enddate 
where a.KodeDinasHeader = 'DN0000001' and b.nip = '1602744'
    group by a.Nip,b.FullName,DATEPART( wk, c.attendanceDate)) q group by Nip ,FullName

这是结果

问题部分。

从第一个结果可以看出。第 37 周是 08:11 (Eight hours eleven minute),周 3810:00 (Ten hours)

当总和超过08 hours (Group by week)时,每个人都会获得一项成就。所以我应该有 2 对吗?

我相信我的问题是因为我不这样做the datadd method for minute

通过上面的查询,我只能总结小时数而不是分钟数。所以我的问题是我怎么能DATEADDHH:MM 格式?

【问题讨论】:

将逻辑改为计算分钟数而不是小时数,将分钟数相加,然后除以 60。 【参考方案1】:

您只需要使用minute。试试下面这个脚本。

select Nip,sum(ro) achieve,FullName
     from( 
        select a.Nip,b.FullName,DATEPART( wk, c.attendanceDate) week, 
        sum(case 
            when DATEADD(MINUTE, -480, OutTime) <=InTime 
            then 0 
            else DATEDIFF(MINUTE, InTime, OutTime) - 480 end)/480 AS RO 
            from DinasHoDetail a 
                left join Employee b on a.Nip = b.Nip 
                left join DinasHoHeader d on a.KodeDinasHeader = d.KodeDinasHeader 
                left join attendance c on a.Nip =c.Nip and attendancedate 
                between d.startdate and d.enddate 
                where a.KodeDinasHeader = 'DN0000001' 
                group by a.Nip,b.FullName,DATEPART( wk, c.attendanceDate)
            ) q group by Nip ,FullName

【讨论】:

【参考方案2】:

对于时间段求和并以新格式显示,不幸的是,首先我们必须将时间差转换为最小有意义的时间单位。在您的情况下,我们必须以分钟为单位计算时差。 然后我们必须对所有已经以分钟为单位的时间段求和。 作为最后一步,我们将在几分钟内格式化所有这些金额;采用新格式 HH:MI 或 HH:MI:SS 等。

示例案例请参考教程Calculate Time Operations in SQL Server

你会在那里看到一个函数 fn_CalculateTimeInSeconds 您需要在几分钟内创建类似

RETURN DATEPART(mi,@time) + 60 * DATEPART(hh,@time)

然后根据需要计算差异

您需要的最后一个函数类似于 fn_CreateTimeFromSeconds,它将以分钟为单位的计算时间格式化为 HH:MI 格式

Create Function fn_CreateTimeFromMinutes (
 @minutes int
) Returns varchar(5)
BEGIN
Return
 --CAST (
  RIGHT('00' + CAST( (@minutes / 60) as varchar(2)), 2) + ':' +
  RIGHT('00' + CAST( (@minutes % 60) as varchar(2)), 2)
-- as Time)
END 
go

【讨论】:

以上是关于SUM 小时和分钟 SQL的主要内容,如果未能解决你的问题,请参考以下文章

如何在反应中将分钟转换为小时和分钟

使用 PHP 将分钟数转换为小时和分钟

TIMESTAMPDIFF 格式转换(小时和分钟)

在EXCEL中如何使用公式计算今天早上8:00到11:40的用了多少个小时?

如何在sql中将分钟拆分为天、小时和分钟

将天、小时和分钟转换为 UTC - node.js