2012-07-11 19 views
5

Tengo usuarios en una base de datos MySQL, donde se almacenan sus cumpleaños en un formato DATE (aaaa-mm-dd). Quiero seleccionar usuarios en la base de datos con PHP que tengan un rango de edad determinado.Seleccionar todos los usuarios que están dentro de un cierto rango de edad

Lo que tengo es una edad mínima (18) y una edad máxima (21). Sé que puedo hacer algo con BETWEEN, pero el problema es que solo sé los años y no las fechas.

¿Alguien tiene alguna sugerencia sobre cómo puedo hacer esto?

Esto es lo que estoy haciendo actualmente:

function leeftijden($age) { 
    $morgen['day'] = date('d'); 
    $morgen['month'] = date('m'); 
    $morgen['year'] = date('Y') - $age; 

    $datum = $morgen['year'] .'-' .$morgen['month'].'-' .$morgen['day']; 

    return $datum; 
} 

Entonces hago esto:

$maxDatum = leeftijden(18); 
$minDatum = leeftijden(32); 
$sqlRijder = "SELECT * FROM rijder WHERE geboortedatum between '".$minDatum."' AND '".$maxDatum."'"; 

Pero esto no funciona al 100%.

¿Cómo solo puedo seleccionar usuarios que tengan entre 18 y 21 años de edad?

+0

has impresa la fecha para asegurarse de que el son correctas? también puede hacer 'date ('Ym-d', strtotime (" - 18 years "));' or 'date ('Ym-d', strtotime (" - $ years years "));' –

+0

Of Por supuesto, no funcionará al 100% - porque la "edad" es un número, no viene en el formato de fecha. Así que tomar la 'fecha' actual y restar la edad dará un resultado inexacto. – alfasin

+0

alfasin ... que es lo que hago en el leeftijden() la función –

Respuesta

14

Usted puede simplemente hacer las cosas bien en la consulta:

SELECT * 
FROM rijder 
WHERE geboortedatum BETWEEN 
    CURDATE() - INTERVAL 21 YEAR AND 
    CURDATE() - INTERVAL 18 YEAR 

esta manera, usted no necesita una función especial de PHP para construir una cadena de fecha. Simplemente pase los números y MySQL hará las comparaciones por usted. Solo asegúrate de que el número más alto esté primero en el BETWEEN.

+0

gracias esto funciona perfecto! –

+0

Excelente solución perfecta @Zane Bien puede contestar esto lo necesito http://stackoverflow.com/questions/12000537/display-count-base-on-the-grand-child –

2
SELECT * FROM rijder 
WHERE geboortedatum 
    between date_add(curdate(), interval -18 year) 
    and date_add(curdate(), interval -21 year) 
4

Prueba este :::

Select * from table where (DATEDIFF(dob, DATE(NOW()))/365.25) between 18 and 21 
+1

No he usado MySQL, pero no lo haría que no usan índices? –

+0

Quieres decir que no es sargable ... –

0

prueba este

SELECT * FROM rijder WHERE DATEDIFF(NOW(), geboortedatum)/365.25 BETWEEN 18 AND 21 
Cuestiones relacionadas