Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Como determino quien cumple años.... (https://www.clubdelphi.com/foros/showthread.php?t=4658)

El_Raso 23-10-2003 05:59:59

Como determino quien cumple años....
 
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:
Cita:

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:

Código:

  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.

Código:

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=...e=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 :

Código:

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:

Código:


  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:


La franja horaria es GMT +2. Ahora son las 10:09:28.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi