none
Como obtener el tiempo en Horas y Minutos en un rango de fechas en sql ? RRS feed

  • Pregunta

  • Quiero obtener la diferencia entre cada fecha en horas y minutos

    Tengo la tabla Despachos con el numoperador - fechasalida - fechallegada como lo muestro en la imagen

    numoperador: 900200


    Quiero poder obtener el tiempo de diferencia entre cada fecha en horas y minutos, este tiempo cambiara ya que quiero que sea de acuerdo a una fechadesde y fechahasta

    Si yo digo que quiero obtener el tiempo que laboro desde el día 17 de enero del 2015 al día 19 de enero del 2015 quiero que me muestre las horas con los minutos sin los segundos solo entre esas fechas.

    El código que tengo hasta el momento es:

    declare @horas int,  @minutos int, @Operador int, @Salida datetime, @llegada datetime
    SELECT @Operador= D.numOperador, 
    	@Salida =D.FechaSalida, 
    	@llegada =D.FechaLlegada,
    	@horas=    DATEDIFF (Hour, D.FechaSalida, D.FechaLlegada) % 24, --As Horas,
    	@minutos=   DATEDIFF (Minute, D.FechaSalida, D.FechaLlegada) % 60-- As Minutos,
    FROM Operadores O
    JOIN Calendario CC ON O.NumOperador = CC.NumOperador
    JOIN Despacho D ON O.NumOperador=D.numOperador
    WHERE O.cveTipoOperador = 2 AND O.NumOperador = 900200 and D.FechaSalida >='2015-01-17 00:00:00.000' and D.FechaLlegada <='2015-01-18 00:00:00.000'
    GROUP BY D.NumOperador, D.FechaSalida, D.FechaLlegada
    select @horas as horas, @minutos as minutos, @Operador as NumOperador, @Salida as Salida,@llegada as LLegada
    y lo que obtengo es lo siguiente, solo me regresa el de las primeras fechas, como puedo hacer para que me regrese la suma de las horas del rango de las fechas seleccionadas

    gracias


    Molitaa

    jueves, 6 de abril de 2017 20:31

Respuestas

  • Si buscas obtener el total de horas y minutos no puedes mostrar las fechas de entrada y salida al detalle.

    SELECT 
        D.numOperador,
        SUM(DATEDIFF(MINUTE, D.FechaSalida, D.FechaLlegada)) / 60 AS [Horas],
        SUM(DATEDIFF(MINUTE, D.FechaSalida, D.FechaLlegada)) % 60 AS [Minutos]
    FROM 
        Operadores O
        INNER JOIN Calendario CC ON O.NumOperador = CC.NumOperador
        INNER JOIN Despacho D ON O.NumOperador = D.numOperador
    WHERE 
        O.cveTipoOperador = 2 
        AND O.NumOperador = 900200 
        AND D.FechaSalida>='2015-01-17 00:00:00.000' AND D.FechaLlegada<='2015-01-18 00:00:00.000'
    GROUP BY 
        D.NumOperador;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta molitaa viernes, 7 de abril de 2017 21:48
    jueves, 6 de abril de 2017 21:13
  • si Willams, una disculpa creo que como ya tenía algo de rato con esto me desespere y no lo vi hasta ahora, ya quite las lineas de 

    , FechaSalida, FechaLlegada  al final de la consulta y he obtenido el resultado, agradezco mucho tu apoyo y la paciencia que has tenido.

    Lindo Viernes. 


    Molitaa

    viernes, 7 de abril de 2017 21:48

Todas las respuestas

  • Si buscas obtener el total de horas y minutos no puedes mostrar las fechas de entrada y salida al detalle.

    SELECT 
        D.numOperador,
        SUM(DATEDIFF(MINUTE, D.FechaSalida, D.FechaLlegada)) / 60 AS [Horas],
        SUM(DATEDIFF(MINUTE, D.FechaSalida, D.FechaLlegada)) % 60 AS [Minutos]
    FROM 
        Operadores O
        INNER JOIN Calendario CC ON O.NumOperador = CC.NumOperador
        INNER JOIN Despacho D ON O.NumOperador = D.numOperador
    WHERE 
        O.cveTipoOperador = 2 
        AND O.NumOperador = 900200 
        AND D.FechaSalida>='2015-01-17 00:00:00.000' AND D.FechaLlegada<='2015-01-18 00:00:00.000'
    GROUP BY 
        D.NumOperador;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta molitaa viernes, 7 de abril de 2017 21:48
    jueves, 6 de abril de 2017 21:13
  • Gracias Willams

    como me lo indicas me regresa 25 horas

    que según yo me debería de regresar 6 horas y los minutos de acuerdo al registro de la tabla


    Molitaa

    jueves, 6 de abril de 2017 21:23
  • La consulta sumariza los minutos que tiene registrado el operador 900200 en todas sus filas, si buscas un resultado por fila entonces basta con quitar la agrupación y la función de agregado:

    SELECT 
        D.numOperador,
        D.FechaSalida,
        D.FechaLlegada,
        DATEDIFF(MINUTE, D.FechaSalida, D.FechaLlegada) / 60 AS [Horas],
        DATEDIFF(MINUTE, D.FechaSalida, D.FechaLlegada) % 60 AS [Minutos]
    FROM 
        Operadores O
        INNER JOIN Calendario CC ON O.NumOperador = CC.NumOperador
        INNER JOIN Despacho D ON O.NumOperador = D.numOperador
    WHERE 
        O.cveTipoOperador = 2 
        AND O.NumOperador = 900200 
        AND D.FechaSalida>='2015-01-17 00:00:00.000' AND D.FechaLlegada<='2015-01-18 00:00:00.000'
    GO



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    jueves, 6 de abril de 2017 21:45
  • gracias Wiliams, si era la primera forma en que me lo indicaste ya hice pruebas con fechas más actuales y me ha regresado el tiempo correcto.

    Tengo sustituido las fechas en donde dice D.FechaSalida y D.FechaLlegada tengo la la fecha fija con el tiempo en cada una voy a colocar @FechaDesde y @Fecha Hasta, pero estoy viendo que si tengo colocado desde el día 10 de Marzo al 11 Marzo me debería de regresar el tiempo de esas fechas y solo me regresa las del día 10 como puedo hacer para que me regrese también las del día 11.

    Para que me regrese la suma de las dos fechas del día 10 y 11 tengo que colocar en D.FechaLlegada hasta el día 12

    	SELECT 
        D.numOperador,
        SUM(DATEDIFF(MINUTE, D.FechaSalida, D.FechaLlegada)) / 60 AS [Horas],
        SUM(DATEDIFF(MINUTE, D.FechaSalida, D.FechaLlegada)) % 60 AS [Minutos]
    FROM 
        Operadores O
        INNER JOIN Despacho D ON O.NumOperador = D.numOperador
    WHERE O.NumOperador = 900200 
        AND D.FechaSalida>='2017-03-10 00:00:00.000' AND D.FechaLlegada<='2017-03-12 00:00:00.000'
    GROUP BY 
        D.NumOperador;
    GO


    los Resultados que me regresa son

    pero en negativos, hay alguna manera de que no me los regrese en negativos ya que me resta el tiempo debería regresar 25 Hrs.

    Gracias.


    Molitaa

    viernes, 7 de abril de 2017 14:41
  • Gracias Willams,

    Ya puedo ver la fecha con la fechafin muchas gracias.

    si fue un error mio la suma, ya que con el código me aparece de la siguiente manera

    entonces vi que eran 17 y 8, y lo que hice fue intentar sumar para que me diera el total de las horas.

    debe de aparecer en vez de 17, 7 con 59 esto se deberá a como están las fechas guardadas en mi tabla con 18 hrs y no como la del día 10 de marzo.

     


    Molitaa

    viernes, 7 de abril de 2017 18:10
  • SELECT
        DATEDIFF(MINUTE, T.FechaLlegada, T.FechaSalida) / 60,
        DATEDIFF(MINUTE, T.FechaLlegada, T.FechaSalida) % 60
    FROM
        (VALUES 
    	   ('20170310 01:14:07', '20170310 09:25:43'),
    	   ('20170311 01:12:05', '20170311 18:13:39')) T (FechaLlegada, FechaSalida)
    
    
    Horas       Minutos
    ----------- -----------
    8           11
    17          1

    Considera que el tiempo: 01:12:05 se refiere a la una 1 de la mañana, no a la una (1) de la tarde (13 horas).


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 7 de abril de 2017 18:23
  • pues estaba mal yo :s , en la Fecha llegada tenia que llegaba el mismo día a la 1 am entonces ahí tenía que ser día 12 y no día 11 por esta razón me daba en negativos.

    Hay alguna manera de que pueda sumar mis dos resultados y dejar uno solo?

     

    que sea 900200  15 horas con 10 minutos?

    SELECT 
        D.numOperador,
    SUM(DATEDIFF(MINUTE, D.FechaSalida, D.FechaLlegada)) / 60 as hora,
    SUM(DATEDIFF(MINUTE, D.FechaSalida, D.FechaLlegada)) % 60 as minutos
    	FROM 
        Operadores O
        INNER JOIN Despacho D ON O.NumOperador = D.numOperador
    WHERE O.NumOperador = 900200 
        AND D.FechaSalida>='2017-03-10 00:00:00.000' AND D.FechaLlegada<=DATEADD(DAY, 1, '2017-03-12 00:00:00.000') 
    GROUP BY 
        D.NumOperador, FechaSalida, FechaLlegada
    GO




    Molitaa

    viernes, 7 de abril de 2017 21:32
  • Hay alguna manera de que pueda sumar mis dos resultados y dejar uno solo?

    ¿No quedo claro la forma de hacerlo en la primera propuesta?. Te recomiendo poner mucho empeño en lo que haces, leer y practicar lo suficiente hasta que entiendas los que realizas.

    En el ejemplo que adjuntas únicamente debes agrupar por la columna [NumOperador]

    SELECT
        T.numOperador,
        SUM(DATEDIFF(MINUTE, T.FechaLlegada, T.FechaSalida) / 60) AS Horas,
        SUM(DATEDIFF(MINUTE, T.FechaLlegada, T.FechaSalida) % 60) AS Minutos
    FROM
        (VALUES 
    	   ('900200', '20170310 01:14:07', '20170310 09:25:43'),
    	   ('900200', '20170311 01:12:05', '20170311 18:13:39')) 
    	   T (numOperador, FechaLlegada, FechaSalida)
    GROUP BY
        T.numOperador;
    GO
    
    numOperador Horas       Minutos
    ----------- ----------- -----------
    900200      25          12
    
    (1 filas afectadas)



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 7 de abril de 2017 21:44
  • si Willams, una disculpa creo que como ya tenía algo de rato con esto me desespere y no lo vi hasta ahora, ya quite las lineas de 

    , FechaSalida, FechaLlegada  al final de la consulta y he obtenido el resultado, agradezco mucho tu apoyo y la paciencia que has tenido.

    Lindo Viernes. 


    Molitaa

    viernes, 7 de abril de 2017 21:48