MySQL从秒转换为另一种自定义格式

时间:2017-10-14 09:04:05

标签: mysql

我有这个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,但我想也许它应该去,如果那时比较24h以下的日子或磨碎机显示自定义字符串X天...任何帮助欢迎。

2 个答案:

答案 0 :(得分:1)

我对此进行了测试,似乎完成了这项工作:

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中,似乎想要在运行之前选择正在使用的数据库。它将函数保存在数据库中,也就是说,您可以在左侧的列中看到它,包括表,视图,存储过程和函数。

答案 1 :(得分:0)

我现在还有另外一个问题,这个上面的功能只能在几秒钟内工作..但我忘记在第一个问题中询问我在数据库中存储的数字:

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 |
+-------------------+