2016-04-04 21 views
0

我有一个包含一些字段的数据库表,其中一个字段是mysql float type字段Mysql以小时计得到float字段的总和

在这个领域

我保持多久,我是在骑自行车以小时例如

2.3 & 3.3 & 2 = 8小时

2.55 & 2.25 & 1 = 6.20小时

任何想法如何我可以得到所需的总时间?

谢谢

+0

那么,你想把总和舍入到最近的整数? –

+0

将数据类型更改为DECIMAL – Strawberry

+0

问题中添加的示例 –

回答

0

你的意思是Sum的方法吗?

SELECT SUM(yourColumn) FROM yourTable 

或者您的意思是Round而不是?

SELECT Round(SUM(yourColumn)) FROM yourTable 

UPDATE 您可以使用此查询,肯定不是最优雅的,但产生你所描述的结果。我也不是普遍的,因为它取决于分数字符。

SELECT 
    SEC_TO_TIME(SUM(subQuery.HourPart * 60 * 60 + subQuery.MinutePart * 60)) as Result 
FROM 
    (
     SELECT 
      CASE 
       WHEN CONVERT(yourColumn, char) LIKE '%.%' THEN 
        CAST(SUBSTRING_INDEX(yourColumn, '.', 1) as unsigned) 
       ELSE 
        yourColumn 
      END as HourPart 
      ,CASE 
       WHEN CONVERT(yourColumn, char) LIKE '%.%' THEN 
        CASE  
         WHEN CONVERT(TimeInHours, char) LIKE '%._' THEN 
          CAST(SUBSTRING_INDEX(TimeInHours, '.', -1) * 10 as unsigned) 
         ELSE 
          CAST(SUBSTRING_INDEX(TimeInHours, '.', -1) as unsigned) 
        END 
       ELSE 0 
      END as MinutePart 
     FROM 
      yourTable 
    ) as subQuery 
+0

圆不会在我的情况下工作,请参阅我添加的问题的示例 –

1

解决方法是将您的列的类型更改为TIME,不要这样。如果你一直在建立一个没有体面的数据库,你只会让自己变得更加困难。

如果将其更改为TIME列你可以轻松地做一个SUM,它会正确计算它

0
使用MySQL “用户变量”CEILFLOORMOD功能和 IF

复杂的解决方案运营商。我创建了测试表duration,其名称为duration(与测试表相同)。
它具有类型FLOAT和两个值序列:1)2.3 | 3.3 | 2,2)2.55 | 2.25 | 1

SET @hours_total := (SELECT sum(duration) FROM `duration`), 
    @hours_main := 0.00, @minutes_total := 0.00, 
    @hours_rest := 0.00, @minutes_rest := 0.00, @minutes_adjusted := 0.00; 

SELECT truncate(hours_main + hours_rest + minutes_adjusted, 2) as result 
FROM (
    SELECT @hours_main := floor(@hours_total) as hours_main, 
     @minutes_total := (mod(@hours_total, 1)*100)/60 as minutes_total, -- converted into hours with minutes residue 
     @hours_rest := floor(@minutes_total) as hours_rest, 
     @minutes_rest := ceil(60 * mod(@minutes_total, 1)) as minutes_rest, 
     @minutes_adjusted := IF(@minutes_rest = 60, 1, @minutes_rest/100) as minutes_adjusted 
    ) as calc 

针对第一序列(2.3 | 3.3 | 2)的输出如下所示:

enter image description here

用于第二序列(2.55 | 2.25 | 1)的输出是这样的:

enter image description here