Hola, hace mucho tiempo resolví este tema de la siguiente manera:
1.- Olvidate del tema de que es cada 2 semanas, tus fechas son quincena y fin de mes, siendo siempre el 15 un día fijo y el fin de mes variable (pues puede ser 28, 29, 30 ó 31)
2.- Para la quincena no me molesto en calcularlo porque tu puedes hacerlo (ya que siempre va a ser 15).
3.- Para el fin de mes simplemente sumas los siguientes valores:
13 (para el caso de 28)
14 (para el caso de 29)
15 (para el caso de 30)
16 (para el caso de 31)
stor ctod(' / / ') to b, b13, b14, b15, b16
a = 15/01/2013
b13 = a+13
b14 = a+14
b15 = a+15
b16 = a+16
4.- Entonces empiezas a preguntar si el mes es el mismo que el del 15.
ejemplo: supongamos que es marzo (31 dias)
a = 15/03/2013
do case
case month(a)=month(b16) && verdadero, month(a)=marzo y month(b16)=marzo , pues b16 = 31/03/2013
b = b16
case month(a)=month(b15) && verdadero, month(a)=marzo y month(b15)=marzo , pues b15 = 30/03/2013
b = b15
case month(a)=month(b14) && verdadero, month(a)=marzo y month(b14)=marzo , pues b14 = 29/03/2013
b = b14
case month(a)=month(b13) && verdadero, month(a)=marzo y month(b13)=marzo , pues b13 = 28/03/2013
b = b13
endcase
&& el valor de b = b16 (31/03/2013) , o sea el primer case
ejemplo: supongamos que es noviembre (30 dias)
a = 15/11/2013
do case
case month(a)=month(b16) && falso, month(a)=nov y month(b16)=dic , pues b16 = 01/12/2013
b = b16
case month(a)=month(b15) && verdadero, month(a)=nov y month(b15)=nov , pues b15 = 30/11/2013
b = b15
case month(a)=month(b14) && verdadero, month(a)=nov y month(b14)=nov , pues b14 = 29/11/2013
b = b14
case month(a)=month(b13) && verdadero, month(a)=nov y month(b13)=nov , pues b13 = 28/11/2013
b = b13
endcase
&& el valor de b = b15 (30/11/2013) , o sea el segundo case
ejemplo: supongamos que es febrero (28 dias)
a = 15/02/2013
do case
case month(a)=month(b16) && falso, month(a)=feb y month(b16)=marzo , pues b16 = 03/03/2013
b = b16
case month(a)=month(b15) && falso, month(a)=feb y month(b15)=marzo , pues b15 = 02/03/2013
b = b15
case month(a)=month(b14) && falso, month(a)=feb y month(b14)=marzo , pues b14 = 01/03/2013
b = b14
case month(a)=month(b13) && verdadero, month(a)=feb y month(b13)=feb , pues b13 = 28/02/2013
b = b13
endcase
&& el valor de b = b13 (28/02/2013) , o sea el cuarto case
ejemplo: supongamos que es febrero (29 dias) año bisiesto
a = 15/02/2013
do case
case month(a)=month(b16) && falso, month(a)=feb y month(b16)=marzo , pues b16 = 02/03/2013
b = b16
case month(a)=month(b15) && falso, month(a)=feb y month(b15)=marzo , pues b15 = 01/03/2013
b = b15
case month(a)=month(b14) && verdadero, month(a)=feb y month(b14)=feb , pues b14 = 29/02/2013
b = b14
case month(a)=month(b13) && verdadero, month(a)=feb y month(b13)=feb , pues b13 = 28/02/2013
b = b13
endcase
&& el valor de b = b14 (29/02/2013) , o sea el tercer case
Suerte.