Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-10-2003
El_Raso El_Raso is offline
Miembro
 
Registrado: oct 2003
Posts: 135
Poder: 21
El_Raso Va por buen camino
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...
Responder Con Cita
  #2  
Antiguo 23-10-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Si lo que se introducen son las fechas completas como indicas.

Where Fecha Between(xxx) and Fecha(xxx)

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 23-10-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #4  
Antiguo 23-10-2003
El_Raso El_Raso is offline
Miembro
 
Registrado: oct 2003
Posts: 135
Poder: 21
El_Raso Va por buen camino
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..
Responder Con Cita
  #5  
Antiguo 23-10-2003
Viet Viet is offline
Miembro
 
Registrado: jul 2003
Ubicación: Argentina - Mar del Plata
Posts: 252
Poder: 21
Viet Va por buen camino
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
__________________
Marín Ignacio Borthiry (Viet) - "El hombre arriesga su vida cada vez que elije y eso es lo que lo hace libre" ;)
Responder Con Cita
  #6  
Antiguo 23-10-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 24-10-2003
Avatar de jzginez
jzginez jzginez is offline
Miembro
 
Registrado: sep 2003
Ubicación: Puebla, México
Posts: 247
Poder: 21
jzginez Va por buen camino
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
__________________
Espero poder seguir exprimiéndote el cerebro 8)
Jorge Zamora Ginez
Puebla, Pue. México
Responder Con Cita
  #8  
Antiguo 24-10-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #9  
Antiguo 24-10-2003
El_Raso El_Raso is offline
Miembro
 
Registrado: oct 2003
Posts: 135
Poder: 21
El_Raso Va por buen camino
Creo que jachguate tiene razon... estoy probando ya le contare...
Gracias a todos...
Responder Con Cita
  #10  
Antiguo 24-10-2003
Avatar de aom
aom aom is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona
Posts: 106
Poder: 22
aom Va por buen camino
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
Responder Con Cita
  #11  
Antiguo 27-10-2003
El_Raso El_Raso is offline
Miembro
 
Registrado: oct 2003
Posts: 135
Poder: 21
El_Raso Va por buen camino
aom y donde estan las FreeUDFLib ...
Responder Con Cita
  #12  
Antiguo 28-10-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #13  
Antiguo 28-10-2003
Avatar de aom
aom aom is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona
Posts: 106
Poder: 22
aom Va por buen camino
Hola,
Marc tiene razón, no habia pensado en los años bisiestos

Saludos
Responder Con Cita
  #14  
Antiguo 28-10-2003
Avatar de jzginez
jzginez jzginez is offline
Miembro
 
Registrado: sep 2003
Ubicación: Puebla, México
Posts: 247
Poder: 21
jzginez Va por buen camino
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
__________________
Espero poder seguir exprimiéndote el cerebro 8)
Jorge Zamora Ginez
Puebla, Pue. México
Responder Con Cita
  #15  
Antiguo 29-10-2003
El_Raso El_Raso is offline
Miembro
 
Registrado: oct 2003
Posts: 135
Poder: 21
El_Raso Va por buen camino
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....
Responder Con Cita
  #16  
Antiguo 29-10-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).

Última edición por guillotmarc fecha: 29-10-2003 a las 14:35:50.
Responder Con Cita
  #17  
Antiguo 03-11-2003
El_Raso El_Raso is offline
Miembro
 
Registrado: oct 2003
Posts: 135
Poder: 21
El_Raso Va por buen camino
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..
Responder Con Cita
  #18  
Antiguo 04-11-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate

Última edición por jachguate fecha: 04-11-2003 a las 06:41:03.
Responder Con Cita
  #19  
Antiguo 04-11-2003
El_Raso El_Raso is offline
Miembro
 
Registrado: oct 2003
Posts: 135
Poder: 21
El_Raso Va por buen camino
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...




Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 19:58:39.


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
Copyright 1996-2007 Club Delphi