Pergunta

Em um SQL banco de dados I fazer algumas seleciona, que recebem uma duração (como resultado de uma subtração entre duas datas) em segundos como um int. Mas eu quero formatar este resultado em um formato legível como 'hh: mm' ou 'dd: hh'. Isso é possível em SQL e como eu posso perceber isso?

Foi útil?

Solução

No SQL 2005, você pode usar o seguinte:

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

Qual primeiros convertidos nos segundos em uma data após 1900-01-01, e em seguida, recebe as hh: parte ss: mm.

Se a coluna é mais do que 24 horas, isso vai rolar, se você quiser dias e depois horas Nesse caso, basta fazer algo como:

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

Outras dicas

Cada banco de dados faz isso de forma diferente. Eu uso PostgreSQL e fá-lo assim:

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

Você terá que consultar o manual para o banco de dados você está usando.

Assumindo que você tem segundos:

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

Eu vou deixar a tarefa de formatação que bem para você. : -)

Não existe um padrão, embora muitos SGBDs têm sua própria sintaxe de costume.

Em geral, é melhor para fazer a formatação-para-humano legibilidade trabalho na camada de apresentação do aplicativo, em vez de em qualquer lugar perto do banco de dados.

No 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
   ;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top