【问题标题】:Convert seconds to human readable time duration将秒转换为人类可读的持续时间
【发布时间】:2012-01-01 21:25:35
【问题描述】:

如何最好地将 90060(秒)转换为“25h 1m”字符串?

目前我在 SQL 中这样做:

SELECT 
  IF(
    HOUR(
      sec_to_time(
        sum(time_to_sec(task_records.time_spent))
      )
    ) > 0, 
    CONCAT(
      HOUR(sec_to_time(sum(time_to_sec(task_records.time_spent)))), 
      'h ', 
      MINUTE(sec_to_time(sum(time_to_sec(task_records.time_spent)))),
      'm'
    ), 
    CONCAT(
      MINUTE(sec_to_time(sum(time_to_sec(task_records.time_spent)))),
      'm'
    )
  ) as time
FROM myTable;

但我不确定这是不是最方便的方法 :-)

我愿意接受有关在 SQL(与我已经在做的不同)或 PHP 中执行此操作的建议。

编辑:

所需字符串的示例:“5m”、“40m”、“1h 35m”、“45h”、“46h 12m”。

【问题讨论】:

  • 不应该 90060 是 1d 1h 1min 而不是 25h 1min 吗?
  • 不,我需要严格按小时计算。
  • 警告接受的答案对于大于 3020399 秒(SEC_TO_TIME 正确转换的最大值)的值失败。也许 OP 的任务永远不会运行超过 839 小时,但这绝对不是通用解决方案。

标签: mysql time duration


【解决方案1】:

试试这个:(输入你的纯秒时间)

var hours = Math.floor(input/3600);
var minutes = Math.floor((input-hours*3600)/60);
var seconds = input-(minutes*60)-(hours*3600);
function convertTime(){
return hours":"minutes":"seconds;
}

【讨论】:

  • 嗯,这是一个 mysql 问题而不是 javascript 问题。
【解决方案2】:

您可以使用预定义的函数 sec_to_time()

sec_to_time(number_of_seconds)

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_sec-to-time

【讨论】:

  • 这对我非常有帮助。 (不一定回答问题,但对我的情况很有帮助。)谢谢!
  • 这增加了接受的答案没有的什么?
  • SEC_TO_TIME 超过 24 小时的小时计数失败(任何无法解析为有效时钟时间的小时计数)。 OP 的示例要求 25 小时的可读表示。这不起作用,并会返回[SQLState S1009] Illegal hour value '25'。这没有回答问题。
【解决方案3】:
TIME_FORMAT(SEC_TO_TIME(task_records.time_spent),'%Hh %im')

文档是你的朋友:


根据评论:

DROP FUNCTION IF EXISTS GET_HOUR_MINUTES;
CREATE FUNCTION GET_HOUR_MINUTES(seconds INT)
  RETURNS VARCHAR(16)

  BEGIN
  DECLARE result VARCHAR(16);
  IF seconds >= 3600 THEN SET result = TIME_FORMAT(SEC_TO_TIME(seconds),'%kh %lm');
  ELSE SET result = TIME_FORMAT(SEC_TO_TIME(seconds),'%lm');
  RETURN result;
  END

DELIMETER ;

用法:

SELECT GET_HOUR_MINUTES(task_records.time_spent) FROM table

【讨论】:

  • 如果时间低于 1 小时,我将如何省略前面的时间部分?示例:“5m”、“40m”、“1h 35m”、“45h”、“46h 12m”?
  • 没有办法在一行中做到这一点。如果你想让你的查询更干净,可以做一个例程dev.mysql.com/doc/refman/5.0/en/stored-routines-syntax.html ?
  • 检查我更新的答案。未经测试,但应该可以正常工作。
  • 我编辑了您的答案以修复语法错误问题以及分钟部分实际上是小时部分的问题。
猜你喜欢
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多