Para recuperar registros entre dos rangos de fechasHola,
Tengo la siguiente tabla de datos con las primeras 4 columnas como entrada y las últimas 2 como salida requerida. Intenté unir dos tablas para combinar las columnas 1-3 y 4 haciendo coincidir ID = ID y Adm.Date = Ref.Date. Ahora quiero dos columnas de salida ( Adm. Fecha_1 y Fecha_después_1) Como se muestra abajo.Necesito que Adm.Date y Dis.Date se completen para todas las Ref.Date entre el rango de Adm.Date y Dis.Date y valor faltante para aquellos que no encajan en el rango de fechas. Pude conseguir el respectivo Adm. Date y Dis.Date usan la función if y lag solo para el siguiente registro y no para todos los registros en ese rango. Avíseme si hay alguna forma de encontrar una solución adecuada a este problema.
Gracias de antemano.
| IDENTIFICACIÓN | Adm. Fecha | Fecha de despido | Ref.Fecha | Adm.Fecha_1 | Fecha de salida_1 |
| 12 | 12/02/2014 | 15/12/2014 | 12/02/2014 | 12/02/2014 | 15/12/2014 |
| 12 | | | 12/03/2014 | 12/02/2014 | 15/12/2014 |
| 12 | | | 12/06/2014 | 12/02/2014 | 15/12/2014 |
| 13 | | | 1/10/2015 | | |
| 13 | 01/06/2016 | 25/1/2016 | 01/06/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 1/10/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 1/11/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 1/12/2016 | 01/06/2016 | 25/1/2016 |
Re: Obtener registros entre dos rangos de fechasGracias por la solución. Funcionó perfectamente.Re: Obtener registros entre dos rangos de fechasPuede adaptarse a esto con bastante facilidad con algunas comprobaciones lógicas de identificación:
dt = Current Data Table();
ad_date_temp = .;
dis_date_temp = .;
id_temp = :ID[1];
for(i=1,i<=N Row(dt), i++,
//Only update these vars if current row has new values for them
If(!Is Missing(:Name("Adm. Date")[i]),
//Execute if new Adm. Date
ad_date_temp = :Name("Adm. Date")[i];
dis_date_temp = :Name("Dis. Date")[i];
id_temp = :ID[i],
);
If(:Name("Ref.Date")[i] >= ad_date_temp & :Name("Ref.Date")[i] <= dis_date_temp & :ID[i] == id_temp,
//Execute if Ref Date is in the current range
:Name("Adm.Date_1")[i] = ad_date_temp;
:Name("Dis.Date_1")[i] = dis_date_temp
,
//Execute if Ref Date is not in the current range
:Name("Adm.Date_1")[i] = .;
:Name("Dis.Date_1")[i] = .
);
);Re: Obtener registros entre dos rangos de fechasHola Wilden,
Gracias por tu solución.
Quiero que Ref.Date esté en el rango de fechas respectivo para esa identificación en particular. Digamos que para la fila 4 (ID 13), Ref.Date está entre Adm.Date y Dis.Date de ID 12, por lo que debería ser "." en lugar de tomar valores de ID 12. Lo ideal es que la fecha se complete según el ID y no según el registro Adm.Date y Dis.Date anterior disponible. No estoy seguro de si este script cumplirá con este requisito. Agradezco su ayuda en esto. Gracias.
Rini
| IDENTIFICACIÓN | Adm. Fecha | Fecha de despido | Ref.Fecha | Adm.Fecha_1 | Fecha de salida_1 |
| 12 | 12/02/2014 | 15/12/2014 | 12/02/2014 | 12/02/2014 | 15/12/2014 |
| 12 | | | 12/03/2014 | 12/02/2014 | 15/12/2014 |
| 12 | | | 12/06/2014 | 12/02/2014 | 15/12/2014 |
| 13 | | | 13/12/2014 | | |
| 13 | | | 1/10/2015 | | |
| 13 | 01/06/2016 | 25/1/2016 | 01/06/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 1/10/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 1/11/2016 | 01/06/2016 | 25/1/2016 |
| 13 | | | 1/12/2016 | 01/06/2016 | 25/1/2016 |
Re: Obtener registros entre dos rangos de fechasAquí hay una solución que funcionó en su caso de prueba al recorrer las filas de la tabla.Déjame saber si necesitas ayuda para entender el código.
dt = Current Data Table();
ad_date_temp = .;
dis_date_temp = .;
for(i=1,i<=N Row(dt), i++,
//Only update these vars if current row has new values for them
ad_date_temp = If(IsMissing(:Name("Adm. Date")[i]),ad_date_temp, :Name("Adm. Date")[i]);
dis_date_temp = If(IsMissing(:Name("Dis. Date")[i]),dis_date_temp, :Name("Dis. Date")[i]);
Show(i, ad_date_temp, dis_date_temp);
If(:Name("Ref.Date")[i] >= ad_date_temp & :Name("Ref.Date")[i] <= dis_date_temp,
//Execute if Ref Date is in the current range
:Name("Adm.Date_1")[i] = ad_date_temp;
:Name("Dis.Date_1")[i] = dis_date_temp
,
//Execute if Ref Date is not in the current range
:Name("Adm.Date_1")[i] = .;
:Name("Dis.Date_1")[i] = .
);
);