将秒转换为易于阅读的时间段

23

我应该如何将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”。


3
90060 应该是 1天1小时1分钟,而不是 25小时1分钟 吗? - Basile Starynkevitch
不,我需要严格按小时计算。 - Henno
1
警告:对于大于3020399秒(SEC_TO_TIME正确转换的最大值)的值,接受的答案将失败。也许OP的任务从未运行超过839小时,但这绝不是通用解决方案。 - Jeff
4个回答

55
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小时,我该如何省略前面的小时部分?示例:"5分钟","40分钟","1小时35分钟","45小时","46小时12分钟"。 - Henno
无法在一行中完成此操作。如果您想使查询更加清晰,可以创建一个例程 http://dev.mysql.com/doc/refman/5.0/en/stored-routines-syntax.html? - Peter
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/5156/discussion-between-henno-and-peter-szymkowski - Henno
我修改了你的答案,以解决语法错误问题和分钟部分实际上是小时部分的问题。 - Henno
我的编辑没有通过同行评审流程(我还没有足够的2000声望来直接编辑其他人的帖子)。请您自己修正答案。 - Henno
显示剩余4条评论

5

1
这对我非常有帮助。(不一定回答问题,但对我的情况非常有帮助。)谢谢! - zeusstl
2
这个有什么额外的东西,被接受的答案没有提到吗? - AStopher
SEC_TO_TIME 在超过 24 小时的小时计数(任何不符合有效时钟时间的小时计数)时会失败。OP 的示例要求对 25 小时进行可读表示。这将无法正常工作,并返回 [SQLState S1009] Illegal hour value '25'。这并没有回答问题。 - mopsyd

0

尝试这个技巧(关于MySQL)

select date_format("1970-01-01 00:00:00" + interval <value_here> second, "%H:%i:%S")

SEC_TO_TIME有时会产生错误的值


你的答案可以通过提供额外支持信息来改进。请[编辑]以添加更多详细信息,例如引用或文档,以便他人确认你的答案是否正确。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

-4

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

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问题。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接