none
Obtener los minutos de diferencia entre dos horas en SQL SERVER RRS feed

  • Pregunta

  • Hola, tengo la siguiente consulta en donde quiero comparar la diferencia de dos horas y el resultado obtenerlo en minutos. Por lo tanto estoy haciendo lo siguiente:

    SELECT CONVERT(VARCHAR(15),CONVERT(TIME,KE.HRZMX(CONCAT(CONCAT(CONCAT(CONCAT(SUBSTRING(CAST(SDDP AS varchar),1,4),'-'), CONCAT(SUBSTRING(CAST(SDDP AS varchar),5,2),'-')),
    CONCAT(SUBSTRING(CAST(SDDP AS varchar),7,2),' '), CONCAT(SUBSTRING(CAST(STD AS varchar),1,2),':')), SUBSTRING(CAST(STD AS varchar),3,2)))),100) HrSalPrevLocal,
    CONVERT(VARCHAR(15),CONVERT(TIME,KE.HRZMX(CONCAT(CONCAT(CONCAT(CONCAT(SUBSTRING(CAST(DATDEPP AS varchar),1,4),'-'), CONCAT(SUBSTRING(CAST(DATDEPP AS varchar),5,2),'-')),
    CONCAT(SUBSTRING(CAST(DATDEPP AS varchar),7,2),' '), CONCAT(SUBSTRING(CAST(HRDEP AS varchar),1,2),':')), SUBSTRING(CAST(HRDEP AS varchar),3,2)))),100) HrSalPrevReal,
    DATEDIFF(MINUTE,CONVERT(VARCHAR(15),CONVERT(TIME,KE.HRZMX(CONCAT(CONCAT(CONCAT(CONCAT(SUBSTRING(CAST(SDDP AS varchar),1,4),'-'), CONCAT(SUBSTRING(CAST(SDDP AS varchar),5,2),'-')),
    CONCAT(SUBSTRING(CAST(SDDP AS varchar),7,2),' '), CONCAT(SUBSTRING(CAST(STD AS varchar),1,2),':')), SUBSTRING(CAST(STD AS varchar),3,2)))),100),
    CONVERT(VARCHAR(15),CONVERT(TIME,KE.HRZMX(CONCAT(CONCAT(CONCAT(CONCAT(SUBSTRING(CAST(DATDEPP AS varchar),1,4),'-'), CONCAT(SUBSTRING(CAST(DATDEPP AS varchar),5,2),'-')),
    CONCAT(SUBSTRING(CAST(DATDEPP AS varchar),7,2),' '), CONCAT(SUBSTRING(CAST(HRDEP AS varchar),1,2),':')), SUBSTRING(CAST(HRDEP AS varchar),3,2)))),100)) Diferencia
    FROM KE.Vuelos2

    En la mayoría de los casos la diferencia en minutos es correcta, pero tengo algunos ejemplos como los siguientes en donde la diferencia no se muestra correctamente:

    Como podrán observar en esos 4 casos en donde hay más de 1000 minutos de diferencia son incorrectos  ya que cuando mucho deberían de existir para el primer caso 25 minutos de diferencia, para el segundo 100 minutos, para el tercero 70 minutos y para el cuarto 100.

    Espero puedan ayudarme.

    viernes, 23 de octubre de 2020 22:26

Todas las respuestas

  • Al no tener la fecha se asume que las dos horas estan en el mismo dia, por lo que el rango 11:35PM hasta 1:15 AM se asume como 1:15AM hasta 11:35PM.  Lo adecuado sería tener la fecha ademas de la hora.

    Si no pasa de 24 horas podrías intentar algo así

    SELECT IIF(CONVERT(TIME, HrSalPrevLocal) < CONVERT(TIME, HrSalPrevReal),
        DATEDIFF(mi, CONVERT(TIME, HrSalPrevLocal), CONVERT(TIME, HrSalPrevReal)),
        1440-(DATEDIFF(mi, CONVERT(TIME, HrSalPrevReal), CONVERT(TIME, HrSalPrevLocal))))

    FROM Vuelos2

    viernes, 23 de octubre de 2020 23:19
  • Hola Gspindola:

    Sería mucho más apropiado para poder ayudarte, que expusieras lo que tienes.

    Tabla ke.vuelos2 con las columnas que menciona la consulta y sus tipos de datos.

    • sddp
    • std 
    • datdepp
    • hrdep

    Y lo que sea ke.hrzmx

    Luego incluyes unos pequeños datos, porque a priori, parece que usas demasiadas funciones (lo cual perjudica al rendimiento), para poder calcular y formatear algo, que debería de ser más sencillo.

    sábado, 24 de octubre de 2020 6:03