Quiero hacer una función basada en tres variables en lenguaje SQL y necesito ayuda.

Hola Smanero. No sé cómo hacer una consulta. Te explico: Tendría tres variables: fecha de inicio, fecha de fin y precio diario. Al introducir una fecha de inicio y otra fecha de fin tendría que obtener de cada mes del año incluido en el rango de fechas el resultado de multiplicar el precio diario por el número de días de cada mes. Ejemplo:
Si quiero saber el precio mensual entre el 1/5/09 y el 6/6/09 siendo el precio diario de 31,30, tendría que obtener el siguiente resultado:
Mayo: 970.30
Junio: 187.80
la operación sería: (Nº de días de mayo (31)*31,30)= 970.30
(Nº de días de junio (6)*31,30)= 187.80

1 Respuesta

Respuesta
1
Tal cual lo planteas, no puede hacerse con una consulta, por que te falta una tabla (o dos). Una tabla de meses y otra de años (esta ultima solo si las fechas pueden abarcar varios años).
Si solo es de un año hazte una tablas de meses poniéndote los campos:
Nº mes (1,2,3...,12)
Literal (Enero, etc.)
Y me cuentas
OK. He creado una tabla de meses con los campos 01,02... 12 y el literal de cada mes. El rango de fechas no abarca varios años sino que será sobre un año en concreto.
Vale, pero para facilitar el código añade un campo más a la tabla llamado ndias donde pondrás los días del mes (31,28,...),
tenemos, pues, una tabla con 3 campos (idmes, literalmes, ndias),
Ahora hacemos una consulta sobre esta tabla, añadiendo los tres campos y
Poniendo el criterio para seleccionar meses:
Campo: idmes
Criterio: entre mes([fecha inicio]) y mes([fecha fin])
Ahora creamos dos campos más:
diafin:iif(mes([fecha fin])>idmes;ndias;dia([fecha fin]))
diaini:iif(mes([fecha inicio])<idmes;1;dia([fecha inicio]))
Como febrero tiene 29 días los bisiestos, tenemos dos soluciones:
1) Lo cambiamos en la tabla antes de hacer la consulta
2) Calculamos si el año es bisiesto o no de esta forma:
iif(idmes=2;IIF(AÑO([fecha inicio]) Mód 4 = 0;1;0);0)
Si te decides por la opcion 2, debes corregir la formula así:
diafin:iif(mes([fecha fin])>idmes;ndias+iif(idmes=2;IIF(AÑO([fecha inicio]) Mód 4 = 0;1;0);0);dia([fecha fin]))
Salvas esta consulta (idmes, literalmes, diafin, diaini)
Ahora haces una nueva agregando esta, el importe buscado te saldrá así:
importe:(diafin-diaini+1)*[precio]
Si alguna fórmula no funciona, puede que tengas que cambiar ; por, ¿ok?.
Parece que tengo algún problemilla. Te cuento:
1.He creado la tabla t_meses_y_dias con tres campos idmes, literalmes y ndias. Los formatos de campo que he puesto son número, texto y número, respectivamente.
2.He creado una consulta agregando la tabla t_meses_y_dias con el siguiente código SQL:
SELECT t_meses_y_dias.idmes, t_meses_y_dias.literalmes, t_meses_y_dias.ndias, IIf(Month([fecha fin])>[idmes],[ndias],dia([fecha fin])) AS diafin, IIf(Month([fecha inicio])<[idmes],1,dia([fecha inicio])) AS diaini
FROM t_meses_y_dias
WHERE (((t_meses_y_dias.idmes) Between Month([fecha inicio]) And Month([fecha fin])));
Al ejecutar me dice que la función día no está definida en la expresión.
3.Ya no puedo seguir.
Espero instrucciones.
Pues day en vez de día.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas