sqlt-sqltimeformatseconds

T-SQL Format seconds as HH:MM:SS time


Is there any tricky way to format seconds like hours:minutes:seconds. For example,

3660

seconds will be displayed as

01h 01m 00s

or

01:01:00

I am aware of the standard way of doing this:

  1. Divide all seconds on 3600 to get the hours
  2. Divide the rest seconds on 60 to get the minutes
  3. The rest are the seconds

I met the following issues:

  1. I am not able to create separate function that do this.

  2. My code is in view using several CTEs. So, variables can be declare using the CTEs only.

  3. I am not able to use the standard solution because I will have results bigger then one day - How to convert Seconds to HH:MM:SS using T-SQL

Solution

  • SELECT Seconds, 
        RIGHT('00'+CONVERT(VARCHAR(10),Seconds/3600),2)  
        +':' 
        + RIGHT('00'+CONVERT(VARCHAR(2),(Seconds%3600)/60),2) 
        +':' 
        + RIGHT('00'+CONVERT(VARCHAR(2),Seconds%60),2) AS [HH:MM:SS] 
    FROM table1
    

    Result:

    Seconds HH:MM:SS
    3660 01:01:00
    3800 01:03:20
    4200 01:10:00
    600 00:10:00
    60 00:01:00
    86400 24:00:00
    86800 24:06:40

    See this SQLFiddle


    Update

    The above query works fine if the total number of hours are less than 100 i.e. (99:59:59). If you need more than that you can use the following query:

    SELECT 
        Seconds,
        CASE Seconds/3600 
        WHEN 0 THEN RIGHT('00'+CONVERT(VARCHAR(10),Seconds/3600),2) 
        ELSE CONVERT(VARCHAR(10),Seconds/3600) END
        +':' 
        + RIGHT('00'+CONVERT(VARCHAR(2),(Seconds%3600)/60),2) 
        +':' 
        + RIGHT('00'+CONVERT(VARCHAR(2),Seconds%60),2) AS [HH:MM:SS]
    FROM table1
    

    Result:

    Seconds HH:MM:SS
    3660 1:01:00
    3800 1:03:20
    4200 1:10:00
    600 00:10:00
    60 00:01:00
    9999930 2777:45:30
    359999 99:59:59
    360000 100:00:00
    86800 24:06:40

    See this SQLFiddle