none
Convertir segundos en hh:mm:ss en SQL RRS feed

  • Pregunta

  • Buenas, 

    Tengo una tabla "llamadas" en la cual tengo un campo "duracion", los datos de este campo están en segundos, quisiera saber como puedo convertirlos en formato hh:mm:ss??

    Yo he buscado e intentado pero no logro que me funcione. 

    Aquí dejo una de las consultas que he hecho y no corre:

    <p> update llamada set duracion = SELECT CONVERT(char(8), DATEADD(second, duracion, '0:00:00'), 108);</p><p>Espero me puedan ayudar.</p>
    

    viernes, 21 de junio de 2013 5:15

Respuestas

  • Hola:

    Si tu campo duracion es de tipo VARCHAR, no tiene caso que un tipo TIME lo almacenes ahi  mismo, te sugiero que si vas a realizar la conversion lo almacenes en un campo del tipo de dato correspondiente, , tampoco especificas que version de SQL SERVER estas utilizando porque hasta cierta version( la cual no recuerdo ) fue introducido el tipo de dato TIME, sino tendras que almacenarlo en un tipo DATETIME

    Tu consulta no corre por el SELECT, quitalo, seria algo asi:

    update llamada set OtroCampoTipoTIME = DATEADD(second, duracion, '00:00:00')

    Si no te sale, primero verifica de la siguiente manera por ejemplo>

    SELECT DATEADD(second, duracion, '00:00:00') as Columna
    FROM llamada


    Sergio Sánchez Arias
    Oaxaca,México
    AYÚDANOS A AYUDARTE

    viernes, 21 de junio de 2013 13:24
  • Si el valor de la duracion es menor a 24 horas entonces el metodo de usar oo:00:00 horas y aniadir los segundos y despues tomar solo la parte del tiempo es correcto. El problema se dara cuando tienes mas de 24 horas ya que al aniadir los segundos a 00:00:00 entonces saltara al proximo dia y al tomar la parte del tiempo este sera una hora quizas temprano en la maniana. Lo mismo pasa si usas el tipo de dato TIME, puesto que este solo llega hasta 24 horas asi que cualquier extra el ciclo comienza desde las 00:00:00 nuevamente.

    Ejemplo:

    DECLARE @duracion int = 123456;
    
    SELECT DATEADD([second], @duracion, '19000101') AS t;
    GO
    /*
    t
    1900-01-02 10:17:36.000
    
    */

    Fijate que use como ancla el dia '19000101' y el resultado cae en el dia '19000102' por lo que si tomas la parte del tiempo veras '10:17:36.000', dando la impresion que la duracion fueron 10 horas 17 minutos y 36 segundos cosa que no es cierta puesto que la duracion fueron 34 horas 17 min y 36 seg.

    Otra forma de lograr lo que deseas es usando simple aritmetica. El # de segundos por dia (24 * 60 * 60), el # de segundos por hora (60 * 60) el # de segundos por minuto (60).

    DECLARE @duracion int = 123456;
    
    SELECT
    	@duracion / (24 * 60 * 60) AS dias,
    	(@duracion % (24 * 60 * 60)) / (60 * 60) AS horas,
    	((@duracion % (24 * 60 * 60)) % (60 * 60)) / 60 AS minutos,
    	((@duracion % (24 * 60 * 60)) % (60 * 60)) % 60 AS segundos;
    GO
    /*
    
    dias	horas	minutos	segundos
    1	10	17	36
    
    */
    


    AMB

    Some guidelines for posting questions...

    viernes, 21 de junio de 2013 14:29

Todas las respuestas

  • Buenas, aqui te dejo un ejemplito que funciona perfectamente:

    DECLARE @datetime2 datetime2 = getdate()
    SELECT convert(char(8), DATEADD(second,300,@datetime2), 108)

    Creo que podrás aplicarlo perfectamente a tu caso :-)

    (El 300 lo he puesto expresamente para añadir 5 minutos)

    Saludos.

    viernes, 21 de junio de 2013 7:06
  • A mi me gusta esta que convierte los segundos a tipo time:

    SELECT DATEADD(second, 300, CAST('00:00:00' AS TIME))

    viernes, 21 de junio de 2013 7:20
  • Hola. ¿Qué tipo de datos tiene el campo "duracion"?

    Gracias y saludos,


    Guillermo Taylor F.
    IT Pro & Xbox gamer
    My blog

    viernes, 21 de junio de 2013 11:33
  • Hola:

    Si tu campo duracion es de tipo VARCHAR, no tiene caso que un tipo TIME lo almacenes ahi  mismo, te sugiero que si vas a realizar la conversion lo almacenes en un campo del tipo de dato correspondiente, , tampoco especificas que version de SQL SERVER estas utilizando porque hasta cierta version( la cual no recuerdo ) fue introducido el tipo de dato TIME, sino tendras que almacenarlo en un tipo DATETIME

    Tu consulta no corre por el SELECT, quitalo, seria algo asi:

    update llamada set OtroCampoTipoTIME = DATEADD(second, duracion, '00:00:00')

    Si no te sale, primero verifica de la siguiente manera por ejemplo>

    SELECT DATEADD(second, duracion, '00:00:00') as Columna
    FROM llamada


    Sergio Sánchez Arias
    Oaxaca,México
    AYÚDANOS A AYUDARTE

    viernes, 21 de junio de 2013 13:24
  • Si el valor de la duracion es menor a 24 horas entonces el metodo de usar oo:00:00 horas y aniadir los segundos y despues tomar solo la parte del tiempo es correcto. El problema se dara cuando tienes mas de 24 horas ya que al aniadir los segundos a 00:00:00 entonces saltara al proximo dia y al tomar la parte del tiempo este sera una hora quizas temprano en la maniana. Lo mismo pasa si usas el tipo de dato TIME, puesto que este solo llega hasta 24 horas asi que cualquier extra el ciclo comienza desde las 00:00:00 nuevamente.

    Ejemplo:

    DECLARE @duracion int = 123456;
    
    SELECT DATEADD([second], @duracion, '19000101') AS t;
    GO
    /*
    t
    1900-01-02 10:17:36.000
    
    */

    Fijate que use como ancla el dia '19000101' y el resultado cae en el dia '19000102' por lo que si tomas la parte del tiempo veras '10:17:36.000', dando la impresion que la duracion fueron 10 horas 17 minutos y 36 segundos cosa que no es cierta puesto que la duracion fueron 34 horas 17 min y 36 seg.

    Otra forma de lograr lo que deseas es usando simple aritmetica. El # de segundos por dia (24 * 60 * 60), el # de segundos por hora (60 * 60) el # de segundos por minuto (60).

    DECLARE @duracion int = 123456;
    
    SELECT
    	@duracion / (24 * 60 * 60) AS dias,
    	(@duracion % (24 * 60 * 60)) / (60 * 60) AS horas,
    	((@duracion % (24 * 60 * 60)) % (60 * 60)) / 60 AS minutos,
    	((@duracion % (24 * 60 * 60)) % (60 * 60)) % 60 AS segundos;
    GO
    /*
    
    dias	horas	minutos	segundos
    1	10	17	36
    
    */
    


    AMB

    Some guidelines for posting questions...

    viernes, 21 de junio de 2013 14:29