我的一个表中有一个列,它是 TIME 格式 (00:00:00)。我正在尝试对整个列求和并将其显示为相同 (00:00:00)。
我尝试使用以下方法,但它并没有给我任何接近正确答案的地方。它给了我 22.12:44:00 并且手动计算告诉我它应该接近 212:something:something
从 tbl_vluchtgegevens选择 SEC_TO_TIME( SUM( vluchttijd
TIME_TO_SEC( ) ) ) 作为总时间
有什么建议吗?
你可以这样尝试:-
SELECT SEC_TO_TIME(SUM(SECOND(vluchttijd ))) AS totaltime FROM tbl_vluchtgegevens;
或试试这个(虽然这不是一个好方法):
SELECT concat(floor(SUM( TIME_TO_SEC( `vluchttijd ` ))/3600),":",floor(SUM( TIME_TO_SEC( `vluchttijd ` ))/60)%60,":",SUM( TIME_TO_SEC( `vluchttijd ` ))%60) AS total_time
FROM tbl_vluchtgegevens;
编辑:-
尝试这个:-
select cast(sum(datediff(second,0,dt))/3600 as varchar(12)) + ':' +
right('0' + cast(sum(datediff(second,0,dt))/60%60 as varchar(2)),2) +
':' + right('0' + cast(sum(datediff(second,0,dt))%60 as varchar(2)),2)
from TestTable
工作SQL 小提琴
在 MySQL 中,TIME
类型的范围相当有限。此外,许多时间函数不接受大于该值的值23:59:59
,使其仅用于表示一天中的时间。
鉴于您的需求,您最好的选择可能是编写一个自定义函数,该函数将模仿SEC_TO_TIME
但允许更大的范围:
CREATE FUNCTION SEC_TO_BIGTIME(sec INT)
RETURNS CHAR(10) DETERMINISTIC
BEGIN
SET @h = sec DIV 3600;
SET @m = sec DIV 60 MOD 60;
SET @s = sec MOD 60;
RETURN CONCAT(
LPAD(@h, 4, '0'),
':',
LPAD(@m, 2, '0'),
':',
LPAD(@s, 2, '0')
);
END;
以下是如何使用它:
create table tbl (dt time);
insert tbl values
('09:00:00'), ('01:00:00'), ('07:50:15'), ('12:00:00'),
('08:30:00'), ('00:45:00'), ('12:10:30');
select SEC_TO_BIGTIME(sum(time_to_sec(dt))) from tbl;
生产:
+--------------------------------------+
| SEC_TO_BIGTIME(SUM(TIME_TO_SEC(DT))) |
+--------------------------------------+
| 0051:15:45 |
+--------------------------------------+
见http://sqlfiddle.com/#!8/aaab8/1
请注意,结果是CHAR(10)
为了克服TIME
类型限制。根据您计划如何使用该结果,这意味着您可能必须将该字符串转换为您的宿主语言中的适当类型。
这对我有用:
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(vluchttijd))) AS totaltime FROM tbl_vluchtgegevens;