none
Como sumar días en sql? RRS feed

  • Pregunta

  • Hola espero me puedan apoyar.

    Tengo una Tabla con el numero de Operador y sus fechas de inicio de Jornada y fin de jornada un clave de incidencia (Vacaciones -Descanso - Permiso - Incapacidad - Falta - Otro) y la fecha de inicio de la incidencia y final de la incidencia.

    Quiero obtener el Total de días que Laboro el Operador de acuerdo a la fecha de inicio de Jornada y Final de la jornada restando los días que pudo hacer tenido una incidencia.

    Tengo mi Query de la siguiente manera, de momento solo he restado las faltas pero como puedo restar todas las demás incidencias, en caso de que tenga una registrada.

    (@NumOperador INT 
    )
    AS

    DECLARE @cveIncidencia int, @DiasFalta INT, @DiasVacaciones INT, @DiasDescanso INT, @DiasPermiso INT, @DiasIncapacidad INT, @DiasOtro INT

    SELECT @DiasVacaciones= (DATEDIFF(DAY , (Fecha_Ini), (Fecha_Fin))+1)   
    FROM Calendario 
    WHERE cveIncidencia=10 AND NumOperador=@NumOperador 

    SELECT @DiasDescanso= (DATEDIFF(DAY , (Fecha_Ini), (Fecha_Fin))+1)   
    FROM Calendario 
    WHERE cveIncidencia=11 AND NumOperador=@NumOperador 

    SELECT @DiasPermiso= (DATEDIFF(DAY , (Fecha_Ini), (Fecha_Fin))+1)   
    FROM Calendario 
    WHERE cveIncidencia=12 AND NumOperador=@NumOperador 

    SELECT @DiasIncapacidad= (DATEDIFF(DAY , (Fecha_Ini), (Fecha_Fin))+1)   
    FROM Calendario 
    WHERE cveIncidencia=13 AND NumOperador=@NumOperador 

    SELECT @DiasFalta= (DATEDIFF(DAY , (Fecha_Ini), (Fecha_Fin))+1)   
    FROM Calendario 
    WHERE cveIncidencia=14 AND NumOperador=@NumOperador 

    SELECT @DiasOtro= (DATEDIFF(DAY , (Fecha_Ini), (Fecha_Fin))+1)   
    FROM Calendario 
    WHERE cveIncidencia=15 AND NumOperador=@NumOperador 

    SELECT TOP 1 (Nombre + ' ' + ApPaterno + ' ' + ApMaterno) AS Operador, j.Descripcion,
    (((DATEDIFF(DAY , (CC.Jornada_Ini), (CC.Jornada_Fin)))+1 )-@DiasFalta)  AS CantDiasTra
    from Operadores O WITH (NOLOCK)
    JOIN Jornada J WITH (NOLOCK)
    ON O.cveJornada=J.cveJornada
    JOIN Calendario CC WITH (NOLOCK)
    ON O.NumOperador=CC.NumOperador
    where O.cveTipoOperador=2 and O.NumOperador=@NumOperador

    Yo tengo muchos Select hay alguna otra forma de reducir mis consultas

    gracias.


    Molitaa


    • Editado molitaa sábado, 1 de abril de 2017 0:06 marco error en la pregunta
    sábado, 1 de abril de 2017 0:06

Respuestas

  • molitaa,

    ¿La relación entre las tablas [Operadores] y [Calendario] es 1:1 o 1:M?, de ser 1:M ¿vuelves a registrar los mismos valores a excepción de los datos de incidencias?, considera modelar las tablas siguiendo las formas de normalización.

    CREATE PROCEDURE dbo.NombreProcedimiento (@NumOperador int)
    AS
    BEGIN    
        SELECT
    	   (Nombre + ' ' + ApPaterno + ' ' + ApMaterno) AS Operador,
    	   j.Descripcion,
    	   (DATEDIFF(DAY, MAX(CC.Jornada_Ini), MAX(CC.Jornada_Fin)) + 1) - 
    		  COALESCE(SUM(DATEDIFF(DAY, Fecha_Ini, Fecha_Fin) + 1), 0) AS CantDiasTra
        FROM
    	   Operadores O
            JOIN Jornada J ON O.cveJornada = J.cveJornada
            JOIN Calendario CC ON O.NumOperador = CC.NumOperador
        WHERE 
    	   O.cveTipoOperador = 2 AND O.NumOperador = @NumOperador
        GROUP BY
    	   (Nombre + ' ' + ApPaterno + ' ' + ApMaterno), j.Descripcion
    END
    GO



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Joyce_ACModerator lunes, 3 de abril de 2017 16:08
    • Marcado como respuesta molitaa martes, 4 de abril de 2017 20:23
    • Desmarcado como respuesta molitaa martes, 4 de abril de 2017 20:23
    • Marcado como respuesta molitaa miércoles, 5 de abril de 2017 14:07
    sábado, 1 de abril de 2017 0:33

Todas las respuestas

  • molitaa,

    ¿La relación entre las tablas [Operadores] y [Calendario] es 1:1 o 1:M?, de ser 1:M ¿vuelves a registrar los mismos valores a excepción de los datos de incidencias?, considera modelar las tablas siguiendo las formas de normalización.

    CREATE PROCEDURE dbo.NombreProcedimiento (@NumOperador int)
    AS
    BEGIN    
        SELECT
    	   (Nombre + ' ' + ApPaterno + ' ' + ApMaterno) AS Operador,
    	   j.Descripcion,
    	   (DATEDIFF(DAY, MAX(CC.Jornada_Ini), MAX(CC.Jornada_Fin)) + 1) - 
    		  COALESCE(SUM(DATEDIFF(DAY, Fecha_Ini, Fecha_Fin) + 1), 0) AS CantDiasTra
        FROM
    	   Operadores O
            JOIN Jornada J ON O.cveJornada = J.cveJornada
            JOIN Calendario CC ON O.NumOperador = CC.NumOperador
        WHERE 
    	   O.cveTipoOperador = 2 AND O.NumOperador = @NumOperador
        GROUP BY
    	   (Nombre + ' ' + ApPaterno + ' ' + ApMaterno), j.Descripcion
    END
    GO



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Joyce_ACModerator lunes, 3 de abril de 2017 16:08
    • Marcado como respuesta molitaa martes, 4 de abril de 2017 20:23
    • Desmarcado como respuesta molitaa martes, 4 de abril de 2017 20:23
    • Marcado como respuesta molitaa miércoles, 5 de abril de 2017 14:07
    sábado, 1 de abril de 2017 0:33
  • Gracias por tu respuesta Willams,

    Utilice lo que me has comentado, pero estaba observando que mi query debo de enviar la Fecha Desde y Fecha Hasta, lo cual no te comente porque aun no lo había revisado.

    Me funciona lo que me indicas, pero como puedo hacer para que las de las incidencias FechaIni y FechaFin se obtengan de acuerdo a la fecha Desde y Fecha hasta que voy a enviarle.


    Molitaa

    martes, 4 de abril de 2017 20:27