A lo largo de mi vida como desarrollador, fui acumulando diversas funciones definidas por el usuario, para distintos tipos de necesidades. En el caso de Fechas he recopilado varias funciones, (algunas fueron ya publicadas en el artículo Trabajar con fechas y horas en Visual FoxPro) que se fueron mejorando por distintos participantes de los foros que yo participo.
Aquí un resumen de funciones referidas a Meses:
* Números de días del mes (Number Days Of Month)
? nDoM(DATE(2012,2,1)) FUNCTION nDoM(tdFecha) RETURN DAY(GOMONTH(DATE(YEAR(tdFecha),MONTH(tdFecha),1),1)-1) ENDFUNC* Principio del mes (Begin Of Month)
? BoM(DATE()) FUNCTION BoM(tdFecha) RETURN DATE(YEAR(tdFecha),MONTH(tdFecha),1) ENDFUNC* Fin de mes (End Of Month)
? EoM(DATE()) FUNCTION EoM(tdFecha) RETURN GOMONTH(DATE(YEAR(tdFecha),MONTH(tdFecha),1),1)-1 ENDFUNC*- Fin del trimestre (End Of Quarter)
? EOQ(DATE()) FUNCTION EOQ(tdFecha) RETURN GOMONTH(DATE(YEAR(tdFecha),CEILING(MONTH(tdFecha)/3)*3,1),1)-1 ENDFUNCLas siguientes funciones retornan la fecha de un día específico, como por ejemplo el primer lunes de enero, o el último domingo de febrero
*-- Tercer Domingo de Octubre de 2011
? OrdDOW(3,1,10,2011) FUNCTION OrdDOW(tnOrd,tnDow,tnMonth,tnYear) * tnOrd: 1=Primero, 2=Segundo, 3=Tercero, ... * tnDow: 1=Domingo ... 7=Sabado * tnMonth: 1=Enero ... 12=Diciembre * tnYear: 1900 ... 9999 RETURN DATE(tnYear,tnMonth,1)+tnOrd*7- ; DOW(DATE(tnYear,tnMonth,1)+tnOrd*7-1,tnDow) ENDFUNC* Último Miercoles de Octubre de 2011
? LastDOW(4,9,2011) FUNCTION LastDOW(tnDow,tnMonth,tnYear) * tnDow: 1=Domingo ... 7=Sabado * tnMonth: 1=Enero ... 12=Diciembre * tnYear: 1900 ... 9999 LOCAL ld ld = GOMONTH(DATE(tnYear,tnMonth,1),1)-1 RETURN ld - (DOW(ld) - tnDow) % 7 ENDFUNCLuis María Guayán