¿Cómo convertir en SQL el número de segundos en una duración legible para humanos?

StackOverflow https://stackoverflow.com/questions/197096

  •  10-07-2019
  •  | 
  •  

Pregunta

En una base de datos SQL hago algunas selecciones, que obtienen una duración (como resultado de una resta entre dos fechas) en segundos como int. Pero quiero formatear este resultado en una forma legible para humanos como 'hh: mm' o 'dd: hh'. ¿Es eso posible en SQL y cómo puedo darme cuenta de esto?

¿Fue útil?

Solución

En SQL 2005, puede usar lo siguiente:

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

Que primero convierte los segundos en una fecha posterior a 1900-01-01, y luego obtiene la parte hh: mm: ss.

Si la columna dura más de 24 horas, esto se transferirá, si desea días y luego horas en ese caso, simplemente haga 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

Otros consejos

Cada base de datos lo hace de manera diferente. Yo uso PostgreSQL y lo hace así:

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

Tendrá que consultar el manual de la base de datos que está utilizando.

Suponiendo que tiene 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

Dejaré la tarea de formatearlo muy bien. :-)

No hay un estándar, aunque muchos DBMS tienen su propia sintaxis personalizada.

En general, es mejor realizar trabajos de formateo para la legibilidad humana en la capa de presentación de su aplicación en lugar de en cualquier lugar cerca de la base de datos.

En 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top