FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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... |
#2
|
||||
|
||||
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:
|
#3
|
||||
|
||||
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). |
#4
|
|||
|
|||
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.. |
#5
|
|||
|
|||
hola
en lo que te ha pasado Marc: Cita:
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" ;) |
#6
|
||||
|
||||
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 Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#7
|
||||
|
||||
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 |
#8
|
||||
|
||||
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
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#9
|
|||
|
|||
Creo que jachguate tiene razon... estoy probando ya le contare...
Gracias a todos... |
#10
|
||||
|
||||
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 |
#11
|
|||
|
|||
aom y donde estan las FreeUDFLib ...
|
#12
|
||||
|
||||
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). |
#13
|
||||
|
||||
Hola,
Marc tiene razón, no habia pensado en los años bisiestos Saludos |
#14
|
||||
|
||||
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 |
#15
|
|||
|
|||
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.... |
#16
|
||||
|
||||
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) :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 15:35:50. |
#17
|
|||
|
|||
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.. |
#18
|
||||
|
||||
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) )
__________________
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 07:41:03. |
#19
|
|||
|
|||
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... |
|
|
|