Ver Mensaje Individual
  #10  
Antiguo 08-05-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Reputación: 21
andres1569 Va por buen camino
Hola otra vez, trataré de explicarlo:

Código:
 
WHERE 7 - (("12/29/2080" - CAMPOFECHA) -
       CAST ((("12/29/2080" - CAMPOFECHA) / 7) AS INTEGER) * 7)
Este galimatías lo que hace es calcular el resto, es decir si tenemos una fecha que sabemos que es domingo (29-12-2080), en Pascal sería algo así:

DiaSemana := (FechaConocidoDomingo - Fecha) mod 7

O sea, restamos la fecha de la fecha conocida como domingo y hallamos el resto de dividir por 7. Si el resto es 0 significa que estamos en domingo (han pasado X semanas exactas), si es 1 el día es sábado, si es 2 es viernes ... si es 6 es lunes. Para que el resultado siga el orden con que numeramos los días de la semana, es decir de 0 a 6, restamos de 7 (mira el principio " 7 - ").

Lo demás es una forma un tanto farragosa de hallar el resto de una división, como no hay una función MOD en SQL (al menos que conozca en SQL local), tenemos que recurrir al truco de hallarlo manualmente:

Restamos las fechas ("12/29/2080" - CAMPOFECHA),

Al resultado de esa resta le restamos los días que suman todas las semanas exactas transcurridas:

CAST ((("12/29/2080" - CAMPOFECHA) / 7) AS INTEGER) * 7

lo cual nos da el número de desfase respecto al domingo.

Al no haber función DIV como en Delphi, dividimos con el operador /, lo cual da un valor float, lo truncamos (CAST X as Integer), y luego volvemos a multiplicar por 7 (esto da un número de días múltiplo exacto de 7, o sea semanas cumplidas)

Es una pena que haya que recurrir a artilugios así para algo que podría venir fácilmente incluido, pero te puedo asegurar que he visto cosas bastante más enrevesadas, concretamente en una base Interbase, para calcular los días de un mes (hablo de Interbase 5.6), y eso que ahí se pueden utilizar StoredProcs y variables.

Saludos
Responder Con Cita