Como calcular el numero de dias entre dos fechas excluyendo los fines de semana

4,982 views
Skip to first unread message

Julio Rossi

unread,
Jan 31, 2012, 9:15:23 AM1/31/12
to publice...@googlegroups.com
Hola gente!! De nuevo por acá!
¿Como podría calcular la diferencia en días entre dos fechas excluyendo los sábados y domingos?
Un saludo cordial!

Julio Rossi
VFP 9 - SP2

Victor Espina

unread,
Jan 31, 2012, 9:19:16 AM1/31/12
to publice...@googlegroups.com, julio...@ilt.com.ar
dFEcha = {fecha inicio}
dHasta = {fecha final}
nDias = 0
DO WHILE dFecha <= dHasta
 IF NOT INLIST(DOW(dFecha),1,6)  && Domingo (1), Sabado (6)
  nDias = nDias + 1 
 ENDIF
 dFecha = dFecha + 1
ENDDO

Saludos

Victor Espina

Luis Maria Guayan

unread,
Jan 31, 2012, 9:24:42 AM1/31/12
to publice...@googlegroups.com
Una forma muy "bruta" es un ciclo contador como la sig. función

? ContarDiasHabiles(DATE(2012,01,01), DATE(2012,01,31))

FUNCTION ContarDiasHabiles(tdIni, tdFin)
  LOCAL lnDias
  m.lnDias = 0
  DO WHILE tdIni <= tdFin
    m.lnDias = m.lnDias + IIF(BETWEEN(DOW(tdIni),2,6),1,0)
    tdIni = tdIni + 1
  ENDDO
  RETURN m.lnDias
ENDFUNC

En PortalFox hay otra función, pero no la he usado ya que necesita una tabla para días festicos

-- Dias habiles entre 2 fechas --
http://www.portalfox.com/article.php?sid=990

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

Julio Rossi

unread,
Jan 31, 2012, 10:32:59 AM1/31/12
to publice...@googlegroups.com
Gracias Victor y Luis Maria!
Las funciones son muy parecidas. Veré como implementarlas.
Un saludo cordial.

Julio Rossi

Alfonso Arias Lemas

unread,
Jan 31, 2012, 11:22:27 AM1/31/12
to publice...@googlegroups.com
AA=DATE(2012,1,20)
BB=DATE(2012,1,17)
?AA-BB



De: Julio Rossi <julio...@ilt.com.ar>
Para: publice...@googlegroups.com
Enviado: Martes 31 de enero de 2012 13:15
Asunto: [vfp] Como calcular el numero de dias entre dos fechas excluyendo los fines de semana

Julio Rossi

unread,
Jan 31, 2012, 11:58:09 AM1/31/12
to publice...@googlegroups.com
Gracias Alfonso, pero la consulta era excluyendo sábados y domingos.

Miltiño

unread,
Jan 31, 2012, 12:20:25 PM1/31/12
to Comunidad de Visual Foxpro en Español
Muy parecida a las anteriores:

dFecha1 = {^2012-01-01}
dFecha2 = {^2012-01-23}
? DiasLab(dFecha1,dFecha2)

FUNCTION DiasLab
LPARAMETERS dFec1, dFec2
LOCAL nDiasL, dFecPtr
nDiasL = 0
dFechaPtr = dFec1
DO WHILE dFechaPtr<=dFec2
IF BETWEEN(DOW(dFechaPtr),2,6)
nDiasL = nDiasL + 1
ENDIF
dFechaPtr = dFechaPtr + 1
ENDDO

RETURN nDiasL
END

Alfonso Arias Lemas

unread,
Jan 31, 2012, 4:51:01 PM1/31/12
to publice...@googlegroups.com
Si ya vi, me apure mucho al responder pero ya creo que te han dado buenas soluciones Julio.

Saludos,
  Alfonso

Enviado: Martes 31 de enero de 2012 15:58
Asunto: Re: [vfp] Como calcular el numero de dias entre dos fechas excluyendo los fines de semana

Julio Rossi

unread,
Jan 31, 2012, 6:53:45 PM1/31/12
to publice...@googlegroups.com
Si Alfonso, voy a probar con las soluciones que me han dado mientras pongo a trabajar mis neuronas a ver si se me ocurre algo.

Saludos!!

Julio Rossi
 



Irlandes 1960

unread,
Feb 1, 2012, 7:27:20 AM2/1/12
to publice...@googlegroups.com
Ojo con los feriados, si estas apuntando a contar días hábiles. En ese caso deberías tener una tabla de feriados.

Julio Rossi

unread,
Feb 1, 2012, 7:32:43 AM2/1/12
to publice...@googlegroups.com
No, los feriados no se toman en cuenta en este caso. Es para sacar el Lead Time de una carga transportada desde su inicio hasta su entrega. Solo debo excluir sábados y domingos.
Gracias!!

Julio Rossi

Julio Rossi

unread,
Feb 1, 2012, 3:15:58 PM2/1/12
to publice...@googlegroups.com
Para los que necesiten algo parecido, hice:

ld_ini = {01-12-2011}
ld_fin = {01-02-2012}

select count(ld_ini+recno()-1) as nu_dias from CUALQUIERTABLA where between(ld_ini+recno()-1,ld_ini,ld_fin) and dow(ld_ini+recno()-1) <> 1 and dow(ld_fin+recno()-1) <> 7

Y en nu_dias esta el total de días excluyendo los sábados y domingos.
Si quito el Count obtengo el detalle total de fechas en el cursor.

Saludos!!!

Julio Rossi





Claudio Luna

unread,
Feb 1, 2012, 5:47:09 PM2/1/12
to publice...@googlegroups.com
Hola
Espero que te pueda servir esta :
*!*    cuantos días si sábado y domingo hay entre dos fechas
fecha1 . .. fecha inicial
fecha2 .. .. fecha final
ncantdias = fecha2 - fecha1
*!*     domingo 1
diainicial = DOW(fecha1)
diafinal   = DOW(fecha2)
nSabDom    = INT(ncantdias / 7) * 2
nSabDom    = IIF(diafinal = 6,nSabDom+1,nSabDom)

RETURN (nCantdias - nSabDom)

Saludos
Claudio

Claudio Luna

unread,
Feb 1, 2012, 7:06:24 PM2/1/12
to publice...@googlegroups.com
También me apure a responder, Julio la solución con el sql es muy ingeniosa ..
muchas gracias por compartirla..
Saludos
Claudio

Claudio Luna

unread,
Feb 1, 2012, 7:12:16 PM2/1/12
to publice...@googlegroups.com
Julio
probando el sql vi que se te había cambiando una letra al final
select count(ld_ini+recno()-1) as nu_dias from cualquiertabla where between(ld_ini+recno()-1,ld_ini,ld_fin) and dow(ld_ini+recno()-1) <> 1 and dow(ld_ini+recno()-1) <> 7

Claudio Luna

unread,
Feb 1, 2012, 7:56:04 PM2/1/12
to publice...@googlegroups.com
Aca otra....


FUNCTION diaslaborales
LPARAMETERS fechai,fechaf
*!*    fechai = Ctod("01/12/2011")
*!*    fechaf = Ctod("05/12/2011")

dinicio = Dow(fechai)
dfinal = Dow(fechaf)
cantdias = (fechaf - fechai) + 1
If dinicio = 1
    diasi = 5
Else
    diasi = 5 - (dinicio - 2)
Endif
If dfinal = 7
    diasf = 5
Else
    diasf = dfinal - 1
Endif

diaslab = (((cantdias - (8 - dinicio) - ffinal) / 7) * 5)
return(diasi + diasf + diaslab)
Saludos
Claudio

Julio Rossi

unread,
Feb 2, 2012, 5:28:47 AM2/2/12
to publice...@googlegroups.com
Hola Clauido, si, como siempre dicen en VFP hay por lo menos tres formas de hacer las cosas :)
Saludos y gracias!

Julio Rossi



 



Mario Alfredo

unread,
Feb 9, 2012, 3:58:05 PM2/9/12
to Comunidad de Visual Foxpro en Español
perdon por meter mi cuchara, el sabado es dow = 7

dFEcha = {fecha inicio}
dHasta = {fecha final}
nDias = 0
DO WHILE dFecha <= dHasta
IF NOT INLIST(DOW(dFecha),1,6) && Domingo (1), Sabado (6) &&&&&
aqui es 7
nDias = nDias + 1
ENDIF
dFecha = dFecha + 1
ENDDO


On Feb 2, 4:28 am, Julio Rossi <julio.ro...@ilt.com.ar> wrote:
> Hola Clauido, si, como siempre dicen en VFP hay por lo menos tres formas de hacer las cosas :)
> Saludos y gracias!
> Julio Rossi
>  El 01/02/2012 09:56 p.m., Claudio Luna escribió:Aca otra....
> FUNCTION diaslaborales
> LPARAMETERS fechai,fechaf
> *!*    fechai = Ctod("01/12/2011")
> *!*    fechaf = Ctod("05/12/2011")
> dinicio = Dow(fechai)
> dfinal = Dow(fechaf)
> cantdias = (fechaf - fechai) + 1
> If dinicio = 1
>     diasi = 5
> Else
>     diasi = 5 - (dinicio - 2)
> Endif
> If dfinal = 7
>     diasf = 5
> Else
>     diasf = dfinal - 1
> Endif
> diaslab = (((cantdias - (8 - dinicio) - ffinal) / 7) * 5)
> return(diasi + diasf + diaslab)
> Saludos
> ClaudioEl 1 de febrero de 2012 21:12, Claudio Luna<thom...@gmail.com>escribió:Julio
> probando el sql vi que se te había cambiando una letra al final
> select count(ld_ini+recno()-1) as nu_dias from cualquiertabla where between(ld_ini+recno()-1,ld_ini,ld_fin) and dow(ld_ini+recno()-1) <> 1 and dow(ld_ini+recno()-1) <> 7
> El 1 de febrero de 2012 21:06, Claudio Luna<thom...@gmail.com>escribió:También me apure a responder, Julio la solución con el sql es muy ingeniosa ..
> muchas gracias por compartirla..
> Saludos
> ClaudioEl 1 de febrero de 2012 19:47, Claudio Luna<thom...@gmail.com>escribió:Hola
> Espero que te pueda servir esta :
> *!*    cuantos días si sábado y domingo hay entre dos fechas
> fecha1 . .. fecha inicial
> fecha2 .. .. fecha final
> ncantdias = fecha2 - fecha1
> *!*     domingo 1
> diainicial = DOW(fecha1)
> diafinal   = DOW(fecha2)
> nSabDom    = INT(ncantdias / 7) * 2
> nSabDom    = IIF(diafinal = 6,nSabDom+1,nSabDom)
> RETURN (nCantdias - nSabDom)
> Saludos

Julio Rossi

unread,
Feb 10, 2012, 4:32:20 AM2/10/12
to publice...@googlegroups.com
Si, el sábado es dow=7. De todas maneras lo resolví mediante un select.
Gracias!!
Julio Rossi

Laycho Albarenga

unread,
Apr 7, 2012, 7:54:05 PM4/7/12
to publice...@googlegroups.com, julio...@ilt.com.ar
Buen aporte pero, en que lenguaje esta hecho?

Victor Espina

unread,
Apr 7, 2012, 11:57:46 PM4/7/12
to publice...@googlegroups.com, julio...@ilt.com.ar
Ehhhh, fox?

Victor Espina
Reply all
Reply to author
Forward
0 new messages