Convert seconds to human readable time duration

Henno picture Henno · Nov 19, 2011 · Viewed 55.4k times · Source

How would I best convert 90060 (seconds) to a string of "25h 1m"?

Currently I'm doing this in 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;

But I'm not sure it's the most convenient method :-)

I'm open to suggestions on doing this both in SQL (differently than I'm already doing) or in PHP.

EDIT:

Examples of desired strings: "5m", "40m", "1h 35m", "45h" "46h 12m".

Answer

Peter picture Peter · Nov 19, 2011
TIME_FORMAT(SEC_TO_TIME(task_records.time_spent),'%Hh %im')

Documentation is your friend:


According to comment:

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 ;

Usage:

SELECT GET_HOUR_MINUTES(task_records.time_spent) FROM table