Mysql以小时为单位获取浮点字段的总和

时间:2016-04-04 13:03:29

标签: mysql

我有一个包含一些字段的数据库表,其中一个字段是mysql float type字段

在这个领域我会花几个小时骑自行车多久,例如

  

2.3& 3.3& 2 = 8小时

     

2.55& 2.25& 1 = 6.20小时

任何想法如何获得所需的总时间?

由于

3 个答案:

答案 0 :(得分:1)

解决方案是将列的类型更改为TIME,不要像这样保留。如果你继续建立一个没有正确设置的数据库,你将只会让自己变得更加困难。

如果您将其更改为TIME列,则只需轻松执行SUM即可正确计算

答案 1 :(得分:0)

你的意思是Sum方法吗?

SELECT SUM(yourColumn) FROM yourTable

或者你想改为Round

SELECT Round(SUM(yourColumn)) FROM yourTable

<强>更新 你可以使用这个查询,当然不是最优雅的,但会产生你描述的结果。我也不普遍,因为它取决于外围人物。

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

答案 2 :(得分:0)

使用Mysql “用户定义的变量”CEILFLOORMOD函数和IF运算符的复杂解决方案。我创建了测试表duration,其中包含名为duration的字段(与测试表相同)。
它具有类型FLOAT和两个值序列:1){{ 1}},2)2.3 | 3.3 | 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 )的输出如下所示:

enter image description here

第二个序列(2.3 | 3.3 | 2)的输出如下所示:

enter image description here