none
Sumar Horas, Minutos y Segundo en SQL SERVER RRS feed

  • Pregunta

  • Hola, tengo una columna que en SQL SERVER que se llama Tiempo y tiene el formato de 00:00:00 y quiero sumar toda la columna total. De ante mano muchas gracias por la información.
    lunes, 5 de diciembre de 2016 22:35

Respuestas

  • Willams Morales 

    El tipo de Dato de la columna es nvarchar(50)

    Motor de la base de datos SQL SERVER 2014

    Y el formato de salida que yo quiero es 'hh:mm:ss'

    De acuerdo.

    Considera que un tipo 'time' está basado en un reloj de 24 horas y es posible que la sumatoria de los valores de la columna 'Tiempo' sobrepase el limite de una instancia válida de tiempo, por tanto, la salida -producto de la sumatoria- podría representarse de dos maneras: una instancia de tiempo considerando días y un reloj de 24 horas, o una cadena con formato (hh:mm:ss) donde la parte de hora (hh) acumula todas las horas transcurridas (sin limitante). Vamos por el segundo caso que entiendo es como lo deseas obtener:

    WITH Seconds AS 
    (SELECT SUM(DATEDIFF(SECOND, '00:00:00', CONVERT(time, Tiempo))) AS 'Seconds' FROM Tabla) 
    SELECT     
        CONCAT(Seconds/3600, ':', 
        RIGHT(CONCAT('00' ,(Seconds % 3600) / 60), 2), ':',
        RIGHT(CONCAT('00' ,(Seconds % 3600) % 60), 2))
    FROM 
        Seconds;
    
    --Resultado: 29:04:25



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Alexander Valle martes, 6 de diciembre de 2016 16:19
    martes, 6 de diciembre de 2016 15:24
  • Alexander Valle,

    Como recomendación, siempre que obtengas un error adjunta el mensaje del mismo para tener un mayor alcance del problema que podría estar ocurriendo.

    ¿Has cambiado el objeto Tabla por el nombre de la tabla que contiene la columna Tiempo?

    AS 'Seconds' FROM NombreTabla) /*Colocar el nombre de la tabla*/


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Alexander Valle martes, 6 de diciembre de 2016 16:19
    martes, 6 de diciembre de 2016 15:58

Todas las respuestas

  • Alexander Valle,

    • ¿Qué tipo de dato es la columna 'Tiempo'? ¿time? ¿varchar()?
    • ¿Qué versión del motor de base de datos ocupas?
    • ¿Cuál es el formato de salida que esperas? ¿hh:mm:ss? ¿dd hh:mm:ss?


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 5 de diciembre de 2016 23:05
  • Willams Morales 

    El tipo de Dato de la columna es nvarchar(50)

    Motor de la base de datos SQL SERVER 2014

    Y el formato de salida que yo quiero es 'hh:mm:ss'

    martes, 6 de diciembre de 2016 14:19
  • Calcula la diferencia en segundos entre cada valor de tiempo y las cero horas '00:00:00', acumula los segundos y luego convierte segundos a dias, horas, minutos y segundos.

    Ejemplo:

    SELECT 
    	(SUM(DATEDIFF(SECOND, '00:00:00', col1)) / 86400) AS dias,
    	(SUM(DATEDIFF(SECOND, '00:00:00', col1)) % 86400) / (3600) AS horas,
    	((SUM(DATEDIFF(SECOND, '00:00:00', col1)) % 86400) % (3600)) / 60 AS minutos,
    	((SUM(DATEDIFF(SECOND, '00:00:00', col1)) % 86400) % (3600)) % 60 AS seconds
    FROM
    	(
    	VALUES
    		('12:23:00'),
    		('10:25:38'),
    		('06:15:47')
    	) AS T(col1)
    GO


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    martes, 6 de diciembre de 2016 14:54
  • Willams Morales 

    El tipo de Dato de la columna es nvarchar(50)

    Motor de la base de datos SQL SERVER 2014

    Y el formato de salida que yo quiero es 'hh:mm:ss'

    De acuerdo.

    Considera que un tipo 'time' está basado en un reloj de 24 horas y es posible que la sumatoria de los valores de la columna 'Tiempo' sobrepase el limite de una instancia válida de tiempo, por tanto, la salida -producto de la sumatoria- podría representarse de dos maneras: una instancia de tiempo considerando días y un reloj de 24 horas, o una cadena con formato (hh:mm:ss) donde la parte de hora (hh) acumula todas las horas transcurridas (sin limitante). Vamos por el segundo caso que entiendo es como lo deseas obtener:

    WITH Seconds AS 
    (SELECT SUM(DATEDIFF(SECOND, '00:00:00', CONVERT(time, Tiempo))) AS 'Seconds' FROM Tabla) 
    SELECT     
        CONCAT(Seconds/3600, ':', 
        RIGHT(CONCAT('00' ,(Seconds % 3600) / 60), 2), ':',
        RIGHT(CONCAT('00' ,(Seconds % 3600) % 60), 2))
    FROM 
        Seconds;
    
    --Resultado: 29:04:25



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Alexander Valle martes, 6 de diciembre de 2016 16:19
    martes, 6 de diciembre de 2016 15:24
  • Hola Willams Morales 

    La variable Seconds as  NO HAY QUE DARLE UN TIPO DE ATRIBUTO POR QUE ME CARGA ERROR EL SQL DE LA VARIABLE COMO QUE NO SE HA DECLARADO?

    WITH Seconds AS (SELECT SUM(DATEDIFF(SECOND, '00:00:00', CONVERT(time, Tiempo))) AS 'Seconds' FROM Tabla) SELECT CONCAT(Seconds/3600, ':', RIGHT(CONCAT('00' ,(Seconds % 3600) / 60), 2), ':', RIGHT(CONCAT('00' ,(Seconds % 3600) % 60), 2)) FROM Seconds;

    De la variable Seconds



    martes, 6 de diciembre de 2016 15:49
  • Alexander Valle,

    Como recomendación, siempre que obtengas un error adjunta el mensaje del mismo para tener un mayor alcance del problema que podría estar ocurriendo.

    ¿Has cambiado el objeto Tabla por el nombre de la tabla que contiene la columna Tiempo?

    AS 'Seconds' FROM NombreTabla) /*Colocar el nombre de la tabla*/


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Alexander Valle martes, 6 de diciembre de 2016 16:19
    martes, 6 de diciembre de 2016 15:58
  • Me imagino que uses un nombre de tabla existente para ejecutar ese ejemplo.

    WITH Seconds AS 
    (SELECT SUM(DATEDIFF(SECOND, '00:00:00', CONVERT(time, Tiempo))) AS [Seconds] FROM (VALUES ('10:35:14'), ('23:45:00')) Tabla(Tiempo)) 
    SELECT     
        CONCAT(Seconds/3600, ':', 
        RIGHT(CONCAT('00' ,(Seconds % 3600) / 60), 2), ':',
        RIGHT(CONCAT('00' ,(Seconds % 3600) % 60), 2))
    FROM 
        Seconds;

    Le aconsejo a ambos, Willams y Alexander que no usen las comillas sencillas (apostrofe) como delimitador de identificadores.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    martes, 6 de diciembre de 2016 16:00

  • WITH Seconds AS -- aqui me marca el error con el Seconds como que no se ha declarado no falta algo despues del as?

    martes, 6 de diciembre de 2016 16:03
  • Hola Willams Morales 

    Fijate que lo hice asi:

    DECLARE @Seconds AS NVARCHAR(50)
    SET @Seconds =
    (SELECT SUM(DATEDIFF(SECOND, '00:00:00', CONVERT(time, horas))) FROM tiempo) 
    SELECT     
        CONCAT(@Seconds/3600, ':', 
        RIGHT(CONCAT('00' ,(@Seconds % 3600) / 60), 2), ':',
        RIGHT(CONCAT('00' ,(@Seconds % 3600) % 60), 2)) as tiempo
    FROM tiempo

    Me SUMA TODAS LAS HORAS PERO EL RESULTADO LO MANDA ASI: 

    1:24:21
    1:24:21
    1:24:21
    1:24:21
    1:24:21
    1:24:21

    ME REPITE EN TODAS LAS FILAS QUE SUME, QUE ME RECOMIENDA XQ SOLO QUIERO UNA SOLA FILA  UN SOLO RESULTADO.

    PROVÉ EL group by horas Y NO FUNCIONA


    martes, 6 de diciembre de 2016 16:10
  • Hola Willams Morales 

    Fijate que lo hice asi:

    DECLARE @Seconds AS NVARCHAR(50)
    SET @Seconds =
    (SELECT SUM(DATEDIFF(SECOND, '00:00:00', CONVERT(time, horas))) FROM tiempo) 
    SELECT     
        CONCAT(@Seconds/3600, ':', 
        RIGHT(CONCAT('00' ,(@Seconds % 3600) / 60), 2), ':',
        RIGHT(CONCAT('00' ,(@Seconds % 3600) % 60), 2)) as tiempo
    FROM tiempo

    Me SUMA TODAS LAS HORAS PERO EL RESULTADO LO MANDA ASI: 

    1:24:21
    1:24:21
    1:24:21
    1:24:21
    1:24:21
    1:24:21

    ME REPITE EN TODAS LAS FILAS QUE SUME, QUE ME RECOMIENDA XQ SOLO QUIERO UNA SOLA FILA  UN SOLO RESULTADO.

    PROVÉ EL group by horas Y NO FUNCIONA

    martes, 6 de diciembre de 2016 16:15
  • ya lo tengo gracias!!!!!
    martes, 6 de diciembre de 2016 16:19
  • Estimado AMB,

    Gracias por la observación, sin embargo no me queda claro el criterio, ¿es por convención?. Entiendo que es válido usar el apóstrofo e incluso la doble comilla como delimitador, pero lo que es válido no necesariamente es lo correcto. Quedo atento a tu respuesta.

    martes, 6 de diciembre de 2016 16:23
  • Correcto, no por ser valido es una buena practica (ejemplo: vista con select top 100 percent ... order by col).

    El apostrofe es un delimitador de cadena y cuando usamos SET QUOTED_IDENTIFIER ON entonces la doble comilla solo aplica a identificadores y no cadenas. Si el seteo anterior es OFF entonces puedes delimitar cadenas con doble comilla y tener apostrofe como parte de la cadena.

    SET QUOTED_IDENTIFIER OFF
    GO
    SELECT "una cadena" AS col1
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SELECT 'una cadena' AS "col 1"
    GO
    Tambien se puede usar los corchetes cuadrados como delimitador de identificadores pero no es codigo portable.

    Si chequeas la documentacion, notaras que no mencionan el uso de comillas simples o apostrofes para delimitar identificadores que son palabras reservadas o que contengan caracteres no validos por las reglas.

    https://msdn.microsoft.com/es-es/library/ms175874.aspx

    https://technet.microsoft.com/es-es/library/ms176027(v=sql.105).aspx

    Principalmente se trata de seguir el stadard ISO y hacer que el codigo sea portable.

    Tambien algunas funciones internas mal interpretan el identificador si este se delimita entre apostrofes o el codigo no puede parsearse.

    Ejemplos:

    -- error
    SELECT SUM ('col1') AS col2
    FROM (VALUES (1)) AS T(col1)
    GO
    -- error
    SELECT col1
    FROM (VALUES (1)) AS T('col1')
    GO
    --error
    SELECT col1
    FROM (VALUES (1)) AS 'T 1'(col1)
    GO

    Como vez, puede un principiante caer en errores y no saber que pasa. Tambien nos damos cuentas que usar el apostrofe para delimitar un identificador solo funciona si es el alias de una columna en la clausula SELECT.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas



    martes, 6 de diciembre de 2016 17:04