Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Cómo obtener niños con edad igual a x meses

Estas en el tema de Cómo obtener niños con edad igual a x meses en el foro de Bases de Datos General en Foros del Web. Hola, teniendo una tabla niño con una columna fechaNacimiento (DATE), cómo puedo obtener los niños cuya edad esté comprendida en los X meses de nacido ...
  #1 (permalink)  
Antiguo 27/03/2017, 09:50
 
Fecha de Ingreso: octubre-2007
Mensajes: 273
Antigüedad: 16 años, 6 meses
Puntos: 5
Cómo obtener niños con edad igual a x meses

Hola, teniendo una tabla niño con una columna fechaNacimiento (DATE), cómo puedo obtener los niños cuya edad esté comprendida en los X meses de nacido hasta la fecha actual. Poorejemplo: 6 meses completos, más los días restantes -1 para cumplir 7.
Ejemplo 6 meses y 12 días; 6 meses y 20 días; 6 meses exactos, desde la fecha de nacimiento hasta la actual son resultados válidos.

Última edición por X_fran; 27/03/2017 a las 10:01
  #2 (permalink)  
Antiguo 27/03/2017, 10:01
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cómo obtener niños con edad igual a x meses

Motor de bases de datos que usas??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 27/03/2017, 10:05
 
Fecha de Ingreso: octubre-2007
Mensajes: 273
Antigüedad: 16 años, 6 meses
Puntos: 5
Respuesta: Cómo obtener niños con edad igual a x meses

Libras la realidad es que la consulta debo hacerla con Doctrine (DQL) y el SGBD aun no se si emplearán MySQL o Postgres, yo durante el desarrollo empleo Postgres pero debería funcionar con ambos.
Posteo la duda en el foro de Bases de datos para tener una idea de cómo hacer la consulta DQL.

La consulta debe arrojar los registros basandose en la fecha actual y la fecha de nacimiento de los niños, ya que es para crear criterios de busqueda por edad, de forma que en la base de datos se almacene la cadena de la consulta (en la tabla del codificador) y la hora de emplear el codificador seleccionando en un filtro pues se emplea la consulta generada.
  #4 (permalink)  
Antiguo 27/03/2017, 10:41
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cómo obtener niños con edad igual a x meses

porque pregunto el manejador de bases de datos? para saber cual seria la sentencia necesaria, ya que como necesitas manejar fechas cada manejador tiene funciones para hacer eso y no todos tienen las mismas, por ejemplo con sql server podrias utilizar la funcion datediff para saber la diferencia entre meses y dias, para mysql la misma funcion no hace lo mismo........
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 27/03/2017, 11:14
 
Fecha de Ingreso: octubre-2007
Mensajes: 273
Antigüedad: 16 años, 6 meses
Puntos: 5
Respuesta: Cómo obtener niños con edad igual a x meses

Libras, el lenguaje de consultas de Doctrine2, incluye las siguientes funciones:[LIST]
  • CURRENT_DATE() - Return the current date
  • DATE_ADD(date, days, unit) - Add the number of days to a given date. (Supported units are DAY, MONTH)
  • DATE_SUB(date, days, unit) - Substract the number of days from a given date. (Supported units are DAY, MONTH)
  • DATE_DIFF(date1, date2) - Calculate the difference in days between date1-date2.

El problema es que no veo como manejar los días restantes para completar el próximo mes -1 día para la edad del niño.
  #6 (permalink)  
Antiguo 27/03/2017, 11:56
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cómo obtener niños con edad igual a x meses

DQL es parecido a TSQL, pero no es lo mismo, y la verdad desconozco sobre ese tema, la logica para hacer un query DQL es diferente a la de TSQL
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 27/03/2017, 12:12
 
Fecha de Ingreso: octubre-2007
Mensajes: 273
Antigüedad: 16 años, 6 meses
Puntos: 5
Respuesta: Cómo obtener niños con edad igual a x meses

Deja ver qué hago al respecto, de todos modos tendré qu calcular el rango de fechas desde la aplicación y pasarlo como parámetro a la query preelaborada del filtro que seleccione el usuario.
  #8 (permalink)  
Antiguo 28/03/2017, 06:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Cómo obtener niños con edad igual a x meses

Cita:
Iniciado por X_fran Ver Mensaje
Libras, el lenguaje de consultas de Doctrine2, incluye las siguientes funciones:[LIST]
  • CURRENT_DATE() - Return the current date
  • DATE_ADD(date, days, unit) - Add the number of days to a given date. (Supported units are DAY, MONTH)
  • DATE_SUB(date, days, unit) - Substract the number of days from a given date. (Supported units are DAY, MONTH)
  • DATE_DIFF(date1, date2) - Calculate the difference in days between date1-date2.

El problema es que no veo como manejar los días restantes para completar el próximo mes -1 día para la edad del niño.
Esas funciones implican que está usando una base MySQL, son nativas de ese DBMS, y para poder calcular solo tienes que leer con cuidado tu propia descripción.
Si te fijas, el DATE_ADD() por ejemplo, te devuelve una fecha dada basado en una fecha (primer parámetro), un valor en cantidad (segundo parámetro, mal denominado "days", y una unidad (tercer parámetro), que especifica cual es el tipo de valor que estás sumando (YEAR, MONTH, DAY, HOUR, MINUTE, SECOND).

Todo es cuestión de entender lo que tu mismo estás mostrando. haz pruebas con códigos experimentales y visualiza lo devuelto.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 28/03/2017, 08:13
 
Fecha de Ingreso: octubre-2007
Mensajes: 273
Antigüedad: 16 años, 6 meses
Puntos: 5
Respuesta: Cómo obtener niños con edad igual a x meses

gnzsoloyo, Libras se que este no es el foro adecuado pero es como ustedes me plantean jugando con las funciones del DQL y un poco de lógica se resuelve:

Disculpen que en este foro ligue un poco de código de otro lenguaje. Simplemente calculo en qué fecha caen 7 meses completos hascia atrás (en caso que desee obtener niños cuya edad está comprendida en los 6 meses de nacidos) y a esta le sumo 1 día "hacia adelante", comparando la nueva fecha con la exacta en la que se cumplen 6 meses hacia atrás a partir de la actual, de esta forma acotaría el periodo de 6 meses más los días antes de cumplirse el séptimo mes:

Código SQL:
Ver original
  1. SELECT n FROM AppBundle:Ninho n
  2. WHERE n.fechaNacimiento BETWEEN DATE_ADD(DATE_SUB(CURRENT_DATE(), :mesesCompletos, 'MONTH'),1,'DAY')
  3. AND DATE_SUB(CURRENT_DATE(), :mesFiltro, 'MONTH')

Sorry por no poner la consulta SQL generada pero me sale un captcha que aunque lo complete correctamente no se publica el post.
Cita:
Editado: Código de programacion no permitido en foros de BBDD

Última edición por gnzsoloyo; 28/03/2017 a las 10:25
  #10 (permalink)  
Antiguo 28/03/2017, 10:35
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Cómo obtener niños con edad igual a x meses

AL menos dos observaciones:
1) NO pongas los nombres de los tipos de dato entre apóstrofes. No son textos, son datatypes.

Código SQL:
Ver original
  1. SELECT n FROM AppBundle:Ninho n
  2. WHERE n.fechaNacimiento
  3.     BETWEEN DATE_ADD(DATE_SUB(CURRENT_DATE(), :mesesCompletos, MONTH),1, DAY)
  4. AND DATE_SUB(CURRENT_DATE(), :mesFiltro, MONTH)
2) No compliques el cálculo. SI lo que quieres es la lista de niños nacidos en los últimos seis meses, incluyendo el día de hoy, es mas simple:

Código SQL:
Ver original
  1. SELECT n FROM AppBundle:Ninho n
  2. WHERE n.fechaNacimiento
  3.     BETWEEN DATE_SUB(CURRENT_DATE(), :mesesCompletos, MONTH)
  4.     AND CURRENT_DATE();

o si quieres:

Código SQL:
Ver original
  1. SELECT n FROM AppBundle:Ninho n
  2. WHERE n.fechaNacimiento >= DATE_ADD(DATE_SUB(CURRENT_DATE(), :mesesCompletos, MONTH),1, DAY) ;
Dado que la fecha de nacimiento nunca será posterior al día en curso, el segundo parametro es innecesario, a menos que quieras un rango específico. Y en ese caso te conviene directament trabajar con fechas:

Código SQL:
Ver original
  1. SELECT n FROM AppBundle:Ninho n
  2. WHERE n.fechaNacimiento
  3.     BETWEEN DATE(:fechainicial)
  4. AND DATE(:fechafinal)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 28/03/2017, 12:06
 
Fecha de Ingreso: octubre-2007
Mensajes: 273
Antigüedad: 16 años, 6 meses
Puntos: 5
Respuesta: Cómo obtener niños con edad igual a x meses

gnzsoloyo, gracias por las aclaraciones, no sabía lo del uso de comillas en las unidades de las funciones de la DQL; una duda si aplico una cláusula BETWEEN a la segunda DQL que me expones, está no arrojará los ninhos que tengan cumplidos 7 meses además !???
  #12 (permalink)  
Antiguo 30/03/2017, 06:28
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Cómo obtener niños con edad igual a x meses

Cita:
Iniciado por X_fran Ver Mensaje
gnzsoloyo, gracias por las aclaraciones, no sabía lo del uso de comillas en las unidades de las funciones de la DQL; una duda si aplico una cláusula BETWEEN a la segunda DQL que me expones, está no arrojará los niños que tengan cumplidos 7 meses además !???
Un between te devolverá todos los datos que cumplan con el RANGO.
Dependerá del rango que indiques lo que obtendrás. Ten en cuenta solamente que los limites del rango son inclusivos, es decir están incluidos en el rango.

Para obtener los que ya han cumplido siete meses, por ejemplo, la fecha desde debería ser, siendo el dia de hoy 30/03/2017, de al menos 30/08/2016.

Ahora bien, cuando necesitas trabajar con valores enteros precisos, es decir, cuando quieres casos donde un valor por una determinada unidad de tiempo sea exacto, es mejor usar otra función TIMESTAMPDIFF(), que es mucho mas precisa.
Código SQL:
Ver original
  1. SELECT n FROM AppBundle:Ninho n
  2. WHERE TIMESTAMPDIFF(MONTH, n.fechaNacimiento, CURDATE()) => 6;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 31/03/2017, 10:14
 
Fecha de Ingreso: octubre-2007
Mensajes: 273
Antigüedad: 16 años, 6 meses
Puntos: 5
Respuesta: Cómo obtener niños con edad igual a x meses

gnzsoloyo, hice algunos cambios como me sugeriste, cambiar los BETWEEN donde se puede por comparaciones de > ó < . Ahora bien, las consultas que planteo pues están escritas en DQL (Doctrine Query Language) y no se si es que realmente la versión de Doctrine2 que empleo tenga incluida algunas de las funciones que me sugieres como CURDATE o TIMESTAMPDIFF, tal vez formen parte de alguna extensión para el Doctrine. De todos modos tus consejos me sirven, y básicamente las SQL que ustedes me plantean, trato de adecuarlas al Doctrine2. pues es para emplear en una app web desplegada en una red de muy baja velocidad en mi país, y creo todo lo que se pueda optimizar pues mejor.

Etiquetas: edad, igual, meses, niños
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:45.