none
Encontrar diferencias entre Fechas RRS feed

  • Pregunta

  • Hola a Todos.

    quisiera que me ayuden con este caso.

    Tengo un tabla con estos datos pongo el ejmplo de un registro de una persona :


    item IdContrato IdPersona FechaIni FechaVen
    1 442 173 1/07/2016 31/08/2016
    2 1534 173 1/09/2016 30/11/2016
    3 1727 173 1/12/2016 31/01/2017
    4 1852 173 1/02/2017 31/03/2017
    5 1923 173 1/04/2017 30/04/2017
    6 1947 173 1/05/2017 31/05/2017
    7 1978 173 1/06/2017 30/06/2017
    8 3055 173 1/07/2017 31/08/2017
    9 3056 173 1/09/2017 30/09/2017
    10 3101 173 1/10/2017 31/10/2017
    11 3164 173 1/11/2017  31/12/2017
    12 3329 173 2/02/2018 31/03/2018
    13 3359 173 1/04/2018 31/07/2018

    el tema es como saco la fecha del ultimo contrato  que en este ejemplo seria (02/02/2018) ya que en el contrato anterior que es el item 11 con la fecha ven (31/12/2017) termino el contrato y ceso el personal. por que hay una diferencia conciderable de dias entre la fecha ve del item 11 y la fecha Ini del Item 12. maximo tiene que  ver un dia de diferencia entre esas dos fechas

    resultado mas o menos asi:

    item IdContrato IdPersona FechaIni FechaVen
    12 3329 173 2/02/2018 31/03/2018
    13 3359 173 1/04/2018 31/07/2018


    • Editado Henryve miércoles, 21 de febrero de 2018 1:39
    miércoles, 21 de febrero de 2018 1:37

Respuestas

  • Calcula la diferencia en días entre la fecha de vencimiento "de la fila actual" y la fecha de inicio de la "fila siguiente", evalúa el resultado y determina si corresponde al mismo contrato (menor o igual a un día de diferencia) o se trata de un nuevo contrato (mayor a un día de diferencia), por ejemplo:

    DECLARE @Contratos table (Inicio date, Vencimiento date);
    INSERT INTO @Contratos VALUES
        ('20160701', '20160831'), ('20160901', '20161130'), ('20161201', '20161231'), -- Primer contrato
        ('20170201', '20170228'), ('20170301', '20170330'), -- Segundo contrato
        ('20170601', '20170630'), ('20170701', '20170731'); -- Tercer contrato
    WITH T AS
    (
        SELECT 
    	   c.Inicio, c.Vencimiento, 
    	   CASE 
    		  WHEN DATEDIFF(DAY, LAG(c.Vencimiento, 1, c.Inicio) 
    			 OVER(ORDER BY c.Inicio), c.Inicio) <= 1 THEN 0
    		  ELSE 1
    	   END AS Diff
        FROM @Contratos c    
    ), Groups AS
    (
        SELECT t.Inicio, t.Vencimiento, SUM(t.Diff) OVER(ORDER BY t.Inicio) AS rn FROM T t
    )
    SELECT g.Inicio, g.Vencimiento 
    FROM Groups g WHERE g.rn = (SELECT MAX(rn) FROM Groups) ORDER BY g.Inicio;
    GO


    miércoles, 21 de febrero de 2018 6:05