SQL中的小时分钟转换

时间:2016-10-27 12:34:42

标签: sql

我及时有3个值,如10.98,10.97,11.0小时。我把aquery写成了

select d.EmployeeID, 
      ( (sum (floor(d.OTHour))+ floor(((sum(d.OTHour-floor(d.OTHour)))*100)/60))
        + cast(((cast(((sum(d.OTHour-floor(d.OTHour)))*100)as int))%60) as float)/100
      ) As TotalOT  
from DailyAttnProcess d 
where d.ShiftID in ( select distinct shiftID 
                            from ShiftTerm st, ShiftTermDetail std, Term t 
                            where st.ShiftTermID=std.ShiftTermID 
                                  and std.TermID=t.TermID and t.TermID=1) 
and d.AttnDate between '01 Oct 2016' and '31 Oct 2016' 
AND d.EmployeeID=9072  
Group By  d.EmployeeID

我得到的结果是34.15,但实际结果应该是32.57。任何人请帮我纠正这个。在此先感谢。

3 个答案:

答案 0 :(得分:0)

您显示的数据不是时间,它就像一个带有整数小时和小时(60分钟= 1)的浮点数。

根据您的数据和32.57的预期结果(小时& 分钟?),您只需要将结果的小数部分相加并乘以0.6:

  floor(sum(d.OTHour))     -- full hours
+ (sum(d.OTHour) % 1)*0.6) -- fractional part in minutes 

当然,如果将时间存储为TIME而不是浮动,则会更容易。

答案 1 :(得分:0)

SELECT minutes / 60 + (minutes % 60) / 100.0 

答案 2 :(得分:0)

您的值不是时间值,而是浮点值。 10.5表示10:3010.75表示10:45

您可以按 添加浮点值,然后计算代表秒数的值:

(此代码有点很多,只是为了显示原则)

DECLARE @tbl TABLE(HourWithFraction FLOAT);
INSERT INTO @tbl VALUES(10.98),(10.97),(11.0);

WITH SummedUp AS
(
    SELECT SUM(HourWithFraction) AS SumOfTimes
    FROM @tbl
)
,InParts AS
(
    SELECT CAST(SumOfTimes AS INT) AS HourPart
          ,SumOfTimes - CAST(SumOfTimes AS INT) AS MinuteFraction 
    FROM SummedUp
)
SELECT HourPart
      ,MinuteFraction
      ,MinuteFraction * 0.6 AS SecondPart
      ,CAST(HourPart AS varchar(10)) + ':' + REPLACE(STR(MinuteFraction * 60,2),' ','0') AS FormattedTime
FROM InParts;

REPLACESTR的使用是为了确保填充0,如果第二个值只有一位数。

结果

HourPart    MinuteFraction  SecondPart  FormattedTime
32          0,950000000000  0,57000000  32:57