PDA

Ver la Versión Completa : Como determino quien cumple años....


El_Raso
23-10-2003, 05:59:59
Necesito un query que me traiga los clientes que cumplen años en un rango de fecha dado.. he intentado hacer lo siguiente:


select a.nombremiembro, a.fechanacimiento
from miembros a
where
((extract(month from a.fechanacimiento) >= :mes) and (extract(month from a.fechanacimiento) <= :mes)

and

(extract(day from a.fechanacimiento) >= :dia2) and (extract(day from a.fechanacimiento) <= :dia))

Si introduzcon un rago de fecha:

Fecha 1 : 01/01/2003
Fecha 2 : 05/07/2003

Un miembro que cumpla el 27/02/2003 no me sale....

Como la mejoro?
Puede ser en codigo delphi tambien...
Una mano por favor...

marcoszorrilla
23-10-2003, 08:15:56
Si lo que se introducen son las fechas completas como indicas.

Where Fecha Between(xxx) and Fecha(xxx)

Un Saludo.

guillotmarc
23-10-2003, 13:01:51
Hola.

¿ Es un error de copiado, o el problema puede ser que has puesto un solo parámetro :mes para el inicial y el final ?

Prueba algo como (es practicamente lo mismo que hacias) :

select a.nombremiembro, a.fechanacimiento
from miembros a
where extract(month from a.fechanacimiento) between extract(month from :fecha_ini) and extract(month from :fecha_fin) and
extract(day from a.fechanacimiento) between extract(day from :fecha_ini) and extract(day from :fecha_fin)

Los parámetros :fecha_ini y :fecha_fin són de tipo Fecha, y podrian ser los ejemplos que has dado : 01/01/2003, 05/07/2003

Saludos.

El_Raso
23-10-2003, 16:03:31
Me explico mejor....

Lo que pasa es que el año no va incluido... porque? por lo siguiente...

Ejemplo:
Si tengo un miembro cuya fecha de nacimiento es 05/07/1971

y estando en el 2003 quiero ver cuanles miembros cumplen año en la semana del 01/07/2003 al 08/07/2003 para felicitarlo...

Ese es el problema por eso no uso el año... solo es el mes... porque puede haver uno que cumpla el 01/07/1950 y debe de salir tambien...

Espero me entiendan ahora... si no diganmelo..

Viet
23-10-2003, 16:50:42
hola

en lo que te ha pasado Marc: select a.nombremiembro, a.fechanacimiento
from miembros a
where
extract(month from a.fechanacimiento) between extract(month from :fecha_ini) and extract(month from :fecha_fin)

and

extract(day from a.fechanacimiento) between extract(day from :fecha_ini) and extract(day from :fecha_fin)



estas trabajando solo con los dias y los meses , nunca el año.

Según lo que quieres y lo que te han pasado tendría que funcionar.

Suerte ;)

jachguate
23-10-2003, 16:50:59
Proba con:


select a.nombremiembro, a.fechanacimiento
from miembros a
where ((extract(month from a.fechanacimiento)*100 +
(extract(day from a.fechanacimiento) between
:mes1 * 100 + :dia1 and :mes2 * 100 + :dia2


mes1, mes2, dia1 y dia2 son del tipo Smallint o algun tipo entero.

Hasta luego.

;)

jzginez
24-10-2003, 01:32:02
Lo que pasa es que tu condicion nunca se cumple por lo menos para el ejemplo que das


quote:
------------------------------------------------------
escrito por El_Raso

where
((extract(month from a.fechanacimiento) >= :mes) and (extract(month from a.fechanacimiento) <= :mes)

and

(extract(day from a.fechanacimiento) >= :dia2) and (extract(day from a.fechanacimiento) <= :dia))

Si introduzcon un rago de fecha:

Fecha 1 : 01/01/2003
Fecha 2 : 05/07/2003

Un miembro que cumpla el 27/02/2003 no me sale....

-------------------------------------------------------

si sustituyes tus variables por los datos en tu ejemplo

extract(month from a. fechanacimiento) = 2
mes = 01

2 >= 1 y 2 <= 1

y esto no se cumple debido a que 2 no es menor que 1, si lo que tienes aqui es un error de dedo y erra mes2 en la segunda parte tendrias:

2 >= 1 y 2<=7

en este caso si se cumple tu condicion pero en la segunda parte de tu condicion tienes:

extract(day from a. fechanacimiento) = 27
dia = 1
dia2 = 5

27>= 1 y 27 <= 5

con lo cual esta segunda condicion no se cumple y por lo tanto todo tu where no funciona.

supongo que ya que extraes el dia y mes de la fecha de nacimiento debes de crear una fecha temporal agregando a estos datos el año actual y entonces asi poder comparar un rango de fechas

guillotmarc
24-10-2003, 01:45:25
Hola

Tienes toda la razón, en los meses intermedios sobra la comparación de dias. Solo hay que modificar la condición where para tener esto en cuenta.


select ...
from Tabla
where (extract(month from ...) between mes1 + 1 and mes2 -1) or
(extract(month from ...) = mes1 and extract(day from ...) >= dia1) or
(extract(month from ...) = mes2 and extract(day from ...) <= dia2) or


Saludos.

El_Raso
24-10-2003, 06:31:22
Creo que jachguate tiene razon... estoy probando ya le contare...
Gracias a todos...

aom
24-10-2003, 18:26:20
Hola,
en la FreeUDFLib de Interbase hay una función llamada DayOfYear que si no he visto mal devuelve el ordinal del dia dentro del año. Esto soluciona mucho la sentencia, porque seria algo asi:

select ...
from Tabla
where DayOfYear(fechanacimiento) between DayOfYear(:fechaInicio) and DayOfYear(:fechaFin)

Yo no suelo utilizar librerías externas (esta tampoco), pero para quien lo haga le puede ser de utilidad.

Saludos

El_Raso
27-10-2003, 22:03:12
aom y donde estan las FreeUDFLib ...

guillotmarc
28-10-2003, 00:40:06
Hola

Aqui tienes una relación bastante completa de UDFs, entre ellas la comentada.

http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_udf_libs

No estoy seguro que utilizar el ordinal del dia en el año te sirva, puesto que ¿ que ocurre en los años bisiestos ?. No tiene el mismo ordinal, por ejemplo un 15 de Diciembre, de un año bisiesta respecto a un año que no lo sea.

¿ No te ha servido la solución de jachguate ?.

NOTA : La ultima consulta que te propuse también debería servirte.

Saludos.

aom
28-10-2003, 10:00:58
Hola,
Marc tiene razón, no habia pensado en los años bisiestos :eek:

Saludos

jzginez
28-10-2003, 21:02:52
quote:
------------------------------------------------------
escrito por guillotmarc


No estoy seguro que utilizar el ordinal del dia en el año te sirva, puesto que ¿ que ocurre en los años bisiestos ?. No tiene el mismo ordinal, por ejemplo un 15 de Diciembre, de un año bisiesta respecto a un año que no lo sea.

--------------------------------------------------------

Yo tampoco creo que te sirva mucho lo de los ordinarios ya que que pasa si tu rango de fechas es por ejemplo:
fecha1 15/12/2003
fecha2 15/01/2004

por ordinarios se invierte tu condición

El_Raso
29-10-2003, 04:12:03
guillotmarc explicame esto con un ejemplo concreto por favor...


select ...
from Tabla
where (extract(month from ...) between mes1 + 1 and mes2 -1) or
(extract(month from ...) = mes1 and extract(day from ...) >= dia1) or
(extract(month from ...) = mes2 and extract(day from ...) <= dia2) or


Te lo voy a agradecer....

guillotmarc
29-10-2003, 14:31:51
Hola

Supón que tienes la tabla CLIENTES, con el campo F_NACIMIENTO. Y que quieres saber los que cumplen años entre el 13 de Febrero y el 5 de Abril.

Entonces la consulta es :


select NOMBRE, APELLIDOS
from CLIENTES
where (extract(month from F_NACIMIENTO) between :MES1 + 1 and :MES2 -1) or
(extract(month from F_NACIMIENTO) = :MES1 and extract(day from F_NACIMIENTO) >= :DIA1) or
(extract(month from F_NACIMIENTO) = :MES2 and extract(day from F_NACIMIENTO) <= :DIA2)


Pasando los siguientes valores a los parámetros :
:MES1 = 2 (Febrero)
:MES2 = 4 (Abril)
:DIA1 = 13 (13 de Febrero)
:DIA2 = 5 (5 de Abril)

Espero que te sirva.

Saludos.

El_Raso
03-11-2003, 17:33:09
Me quedare con la de jachguate aunque eso si, no puedo pasarme de un año a otro en los rangos de fecha..

Ej..
del 15/12/2003 al 15/01/2004 no me trae nada...

Solo funciona dentro de un mismo año... si alguien la arregla que me de un toque.. que yo no he podido..

jachguate
04-11-2003, 06:36:36
Normalmente no me gusta hacer el trabajo de otros... pero esta vez, hare una excepción, porque creo que lo que quizas es obvio para mi podria tomarte dias enteros a vos..., pero te insto a que sigas haciendo esfuerzos por investigar por tu cuenta y fabricar tus propias soluciones...

La sentencia quedaria asi:



select a.nombremiembro, a.fechanacimiento
from miembros a
where ((
((extract(month from a.fechanacimiento)*100 +
(extract(day from a.fechanacimiento) between
:mes1 * 100 + :dia1 and :mes2 * 100 + :dia2)
and (:mes1 * 100 + :dia1 <= :mes2 * 100 + :dia2)
) or
((
((extract(month from a.fechanacimiento)*100 +
(extract(day from a.fechanacimiento) between
:mes2 * 100 + :dia2 and :mes1 * 100 + :dia1)
and (:mes1 * 100 + :dia1 > :mes2 * 100 + :dia2)
)



Hasta luego.

;)

El_Raso
04-11-2003, 15:46:21
Gracias jachguate por el consejo, de corazon te digo que cuando recurro a estos medios es porque ya no encuentro la solucion, y creo tambien que esta es la naturaleza de estos foros ayudar a los demas....

Tengo un amigo que dice:
"Que existen personas que tu te pones a observar un barco como se aleja a la orilla del mar, y llega un momento en que uno pierde el barco en el horizonte y tu amigo lo sigue viendo"

Gracias hermano...




:confused: