2008-10-13 9 views
2

В SQL-базе данных я делаю несколько выборок, которые получают продолжительность (как результат вычитания между двумя датами) в секундах как int. Но я хочу отформатировать этот результат в удобочитаемой форме, например «hh: mm» или «dd: hh». Это возможно в SQL и как я могу это понять?Как конвертировать в SQL количество секунд в человеко-читаемую продолжительность?

ответ

5

В SQL Server 2005, Вы можете использовать следующее:

select convert(varchar(8), dateadd(second, [SecondsColumn], 0), 108) 

Какой первый преобразующий секунды в дату после 1900-01-01, а затем получает в чч: мм: сс часть.

Если столбец более 24 часов, это будет пролонгировать, если вы хотите дней, а затем часов в этом случае просто сделать что-то вроде:

case when SecondsColumn> (24*60*60) 
     then 
      cast(datepart(day,datediff(dd, 0, dateadd(second, SecondsColumn, 0))) as varchar(4)) 
     + 'd' + convert(varchar(2), dateadd(second, SecondsColumn, 0), 108) 
    else 
      convert(varchar(8), dateadd(second, SecondsColumn, 0), 108) 
    end 
2

Каждая база данных делает это по-разному. Я использую PostgreSQL и делает это так:

select to_char(my_date - my_other_date, 'HH:MM:SS'); 

Вы должны обратиться к руководству для используемой базы данных.

+0

В следующих работах: выберите to_char (интервал '1000s', 'HH24: MI: SS'); или выберите to_char (now() - pg_postmaster_start_time(), «DDD» дни «HH24: MI: SS»); – 2008-10-13 10:17:12

2

Если у вас есть секунд:

DECLARE @DurationSeconds INT 

-- 25h 45m 14s 
SET @DurationSeconds = (25 * 3600) + (45 * 60) + (14) 

SELECT 
    @DurationSeconds, 
    @DurationSeconds/3600 hours, 
    @DurationSeconds % 3600/60 minutes, 
    @DurationSeconds % (3600/60) seconds 

Я дам задачу форматирования, что хорошо для вас. :-)

0

Нет стандарта, хотя многие СУБД имеют свой собственный собственный синтаксис.

В общем, лучше делать работу по форматированию для чтения человеком в слое презентации приложения, а не где-либо рядом с базой данных.

0

В Oracle SQL:

-- 86,400 seconds in a day 
    -- 3,600 seconds in an hour 
    --  60 seconds in a minute 
    select duration, -- seconds 
    trunc((duration)/86400) || ':' || -- dd 
    trunc(mod(duration,86400)/3600) || ':' || -- hh 
    trunc(mod(mod(duration,86400),3600)/60) || ':' || -- mm 
    mod(mod(mod(duration,86400),3600),60) -- ss 
    as human_readable 
    from dual 
    ;