我有这个javascript代码,工作正常:
function timeup(s) {
var d, h, m, s;
m = Math.floor(s / 60);
s = s % 60;
h = Math.floor(m / 60);
m = m % 60;
d = Math.floor(h / 24);
h = h % 24;
m = m > 9 ? m : "0"+m;
h = h > 9 ? h : "0"+h;
s = s > 9 ? s : "0"+s;
if (d > 0) {
d = d+" days ";
} else {
d = "";
}
return d+h+":"+m+":"+s;
}
所以我需要相同的功能,但在 MySQL 中(因为我做 SQL 查询并且不想在客户端使用 javascript 转换)
所以我需要在 MySQL 秒内转换以获得相同的输出:
timeup(600000) => 6 days 22:40:00
timeup(60000) => 16:40:00
timeup(6000) => 01:40:00
timeup(600) => 00:10:00
timeup(60) => 00:01:00
timeup(60) => 00:01:00
timeup(6) => 00:00:06
因此,如果低于一天的秒数显示 HH:MM:SS,如果当天的秒数大则显示 X 天 HH:MM:SS
我正在尝试使用 CONCAT 和 TIMESTAMPDIFF,但我认为如果然后比较 24 小时以下的一天或刨丝器以显示自定义字符串 X 天......欢迎任何帮助。
我对此进行了测试,它似乎可以完成这项工作:
DROP FUNCTION IF EXISTS GET_HOUR_MINUTES;
DELIMITER $$
CREATE FUNCTION GET_HOUR_MINUTES(seconds INT)
RETURNS VARCHAR(16)
BEGIN
RETURN CONCAT(LPAD(FLOOR(HOUR(SEC_TO_TIME(seconds)) / 24), 2, 0), ' days ',TIME_FORMAT(SEC_TO_TIME(seconds % (24 * 3600)), '%H:%i:%s'));
END;
$$
DELIMITER ;
像这样测试它:
SELECT GET_HOUR_MINUTES(600001);
返回
'06 days 22:40:01'
它似乎希望,至少在MySQL Workbench中,在运行之前选择您正在使用的数据库。它将函数保存在数据库中,也就是说,您可以在左侧的列中看到它与表,视图,存储过程和函数。
对上述功能有另一个问题,它只适用于秒。但是我忘了问我在数据库存储号码中的第一个问题:
uptime => 1507977507423
我需要从NOW()
时间获得秒数并显示上述格式
因此,例如,如果我在数据库中有正常运行时间,那么公式将是:NOW() - 正常运行时间,我尝试使用它,但我得到奇怪的输出,例如 34 天 838:59:59,这是不正确的:
SELECT
CONCAT(LPAD(FLOOR(HOUR(SEC_TO_TIME(UNIX_TIMESTAMP(NOW())-SUBSTRING(uptime, 1, length(uptime) - 2))) / 24), 2, 0), ' days ',TIME_FORMAT(SEC_TO_TIME(UNIX_TIMESTAMP(NOW())-SUBSTRING(uptime, 1, length(uptime) - 2) % (24 * 3600)), '%H:%i:%s')) AS nice_date
FROM streams
WHERE id=1;
我明白这个:
+-------------------+
| nice_date |
+-------------------+
| 34 days 838:59:59 |
+-------------------+