none
Detalle con select en sql al sacar diferencia de horas, minutos y segundos del mismo día. RRS feed

  • Pregunta

  • Tengo una tabla llamada RegistroTiempo que contiene estos dos campos:

    Necesito obtener la diferencia de horas, minutos y segundos entre ambos campos, para ello utilicé está consulta:

    SELECT CONVERT(varchar (10),DATEADD(MINUTE, DATEDIFF(MINUTE, TiempoEfectuado, TiempoRegistrado),0),108) AS Diferencia, from  RegistroTiempo

    Más sin embargo el resultado que obtengo es este:

    Sí me da la diferencia como yo lo ocupo pero solo cuando la hora del campo Tiempo Efectuado es menor a la hora del campo Tiempo Registrado, pero cuando es mayor, como en el segundo registro, me da una diferencia de casi un día aunque ambas horas pertenezcan al mismo día, yo ocuparía que solo me diera 1:40:00 y no 22:20:00

    Alguna sugerencia para que siempre considere la diferencia de horas en el mismo día? Les agradecería mucho su apoyo, no lo he podido conseguir :(

    Saludos!

                                                    
    viernes, 29 de diciembre de 2017 18:11

Respuestas

  • Hola Joan_23

    Puedes utilizar la siguiente función para obtener los datos que necesitas

    CREATE FUNCTION [dbo].[FuncionTIEMPO]
    (
        @FromDate DATETIME,
        @ToDate DATETIME
    )
    RETURNS VARCHAR(80)
    AS
    BEGIN
        RETURN  (
                    SELECT  CASE DATEPART(DAYOFYEAR, Duration)
                                WHEN 2 THEN '1 Day, '
                                ELSE CAST(DATEDIFF(DAY, 0, Duration) AS VARCHAR(11)) + ' Days, '
                            END +
                            CASE DATEPART(HOUR, Duration)
                                WHEN 1 THEN '1 Hour, '
                                ELSE DATENAME(HOUR, Duration) + ' Hours, '
                            END + 
                            CASE DATEPART(MINUTE, Duration)
                                WHEN 1 THEN '1 Minute, '
                                ELSE DATENAME(MINUTE, Duration) + ' Minutes, '
                            END + 
                            CASE DATEPART(SECOND, Duration)
                                WHEN 1 THEN '1 Second, '
                                ELSE DATENAME(SECOND, Duration) + ' Seconds'
                            END
                    FROM    (
                                SELECT  DATEADD(SECOND, ABS(DATEDIFF(SECOND, @FromDate, @ToDate)), 0) AS Duration
                            ) AS d
                )
    END

    -- El resultado que deseas lo obtendrás fácilmente

    tu primer ejemplo

    y tu segundo registro también lo obtendrás sin problema

    para llamar la función desde tu consulta solo debes hacer lo siguiente

    SELECT dbo.FuncionTIEMPO(TiempoEfectuado, TiempoRegistrado) AS Diferencia from  RegistroTiempo

    Saludos.


    Damian C M



    viernes, 29 de diciembre de 2017 20:53
  • Deleted
    sábado, 30 de diciembre de 2017 0:14

Todas las respuestas

  • Hola Joan_23

    Puedes utilizar la siguiente función para obtener los datos que necesitas

    CREATE FUNCTION [dbo].[FuncionTIEMPO]
    (
        @FromDate DATETIME,
        @ToDate DATETIME
    )
    RETURNS VARCHAR(80)
    AS
    BEGIN
        RETURN  (
                    SELECT  CASE DATEPART(DAYOFYEAR, Duration)
                                WHEN 2 THEN '1 Day, '
                                ELSE CAST(DATEDIFF(DAY, 0, Duration) AS VARCHAR(11)) + ' Days, '
                            END +
                            CASE DATEPART(HOUR, Duration)
                                WHEN 1 THEN '1 Hour, '
                                ELSE DATENAME(HOUR, Duration) + ' Hours, '
                            END + 
                            CASE DATEPART(MINUTE, Duration)
                                WHEN 1 THEN '1 Minute, '
                                ELSE DATENAME(MINUTE, Duration) + ' Minutes, '
                            END + 
                            CASE DATEPART(SECOND, Duration)
                                WHEN 1 THEN '1 Second, '
                                ELSE DATENAME(SECOND, Duration) + ' Seconds'
                            END
                    FROM    (
                                SELECT  DATEADD(SECOND, ABS(DATEDIFF(SECOND, @FromDate, @ToDate)), 0) AS Duration
                            ) AS d
                )
    END

    -- El resultado que deseas lo obtendrás fácilmente

    tu primer ejemplo

    y tu segundo registro también lo obtendrás sin problema

    para llamar la función desde tu consulta solo debes hacer lo siguiente

    SELECT dbo.FuncionTIEMPO(TiempoEfectuado, TiempoRegistrado) AS Diferencia from  RegistroTiempo

    Saludos.


    Damian C M



    viernes, 29 de diciembre de 2017 20:53
  • Deleted
    sábado, 30 de diciembre de 2017 0:14
  • Damian C M muchas gracias por tu respuesta, realmente me sirvió de mucho.
    miércoles, 3 de enero de 2018 16:25
  • Muchas gracias por tu respuesta José Diz, realmente me sirvió muchímo como referencia para mi consulta.

    De verdad, muchas gracias.

    miércoles, 3 de enero de 2018 16:28