我有一个包含一些字段的数据库表,其中一个字段是mysql float type字段。
在这个领域我会花几个小时骑自行车多久,例如
2.3& 3.3& 2 = 8小时
2.55& 2.25& 1 = 6.20小时
任何想法如何获得所需的总时间?
由于
答案 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 “用户定义的变量”,CEIL
,FLOOR
,MOD
函数和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
)的输出如下所示:
第二个序列(2.3 | 3.3 | 2
)的输出如下所示: