Foros del Web » Programando para Internet » PHP »

buscar por edad

Estas en el tema de buscar por edad en el foro de PHP en Foros del Web. Buenas, Estoy haciendo un formulario para buscar por edad a gente... En la base de datos guardo el time() de la fecha de nacimiento de ...
  #1 (permalink)  
Antiguo 30/03/2011, 21:29
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 13 años
Puntos: 5
buscar por edad

Buenas,
Estoy haciendo un formulario para buscar por edad a gente...
En la base de datos guardo el time() de la fecha de nacimiento de los usuarios.

Lo que quiero es que si pongo 22 saque todos los usuarios que tienen 22 años. Lo que estaba haciendo era lo siguiente:

$timeEdad = time() - 60*24*365*$anos;


Asi obtengo el time que fue hace esos años en este momento, pero en la consulta no puedo poner que sea mayor que ese resultado y menor que ese resultado mas 1 año, por que no coincidiria con la realidad.

Alguna idea?
  #2 (permalink)  
Antiguo 30/03/2011, 21:59
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 14 años
Puntos: 1532
Respuesta: buscar por edad

así el campo sea timestamp, el interprete SQL provee, según la base de datos de funciones como YEAR(field_datetime) para extraer una parte especifica de la fecha / fecha hora
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 30/03/2011, 23:13
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 13 años
Puntos: 5
Respuesta: buscar por edad

pero no utilizo un campo timestamp, sino un tipo INT donde guardo el time() simplemente, lo necesito con el time()
  #4 (permalink)  
Antiguo 30/03/2011, 23:21
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 14 años
Puntos: 1532
Respuesta: buscar por edad

bueno si lo que estás es almacenando el timestamp en el campo int, puedes cambiar el tipo a timestamp en la base de datos, al final un timestamp es un int

y si no quieres arriesgarte, puedes buscar sobre funciones de CAST para convertir explicitamete el int (que es timestamp) en un timestamp y poder usar YEAR()
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #5 (permalink)  
Antiguo 31/03/2011, 00:00
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 13 años
Puntos: 5
Respuesta: buscar por edad

muchas gracias!! voy a buscar info sobre esto que comentas!
  #6 (permalink)  
Antiguo 31/03/2011, 00:04
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 13 años
Puntos: 5
Respuesta: buscar por edad

creo que no sirve, por que no es lo mismo el int que genera un time() que el int que normalmente se guarda en un campo timestamp

20040602180324 (equivale a el 2/6/2004 a las 18:03:24)

el time que yo guardo equivale a los segundos transcurridos desde 1970... vamos lo que viene siendo el time de toda la vida... :S

alguna sugerencia, supongo que la respuesta tiene que ir encaminada a una serie de operaciones matematicas o algo.. :S
  #7 (permalink)  
Antiguo 31/03/2011, 10:53
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 14 años
Puntos: 1532
Respuesta: buscar por edad

depende de si el timestamp está en segundos o milisegundos, por lo que tendrás que dividirlo por 1000
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #8 (permalink)  
Antiguo 31/03/2011, 15:18
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 13 años
Puntos: 5
Respuesta: buscar por edad

mmmm o no entiendo o me estas dando una respuesta que no es :S

un time de php genera los segundos que han transcurrido desde 1970, no puedo (dividiendo por 1000) convertir un time() de php en un timestamp de este tipo 20040602180324 (este timestamp claramente tiene la fecha toda seguida sin espacios...)
  #9 (permalink)  
Antiguo 31/03/2011, 16:01
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 13 años
Puntos: 5
Respuesta: buscar por edad

Puede que sea algo complicado de entender, pero estoy haciendo un buscador, con opciones en el input de busqueda, en plan que le puedas pasar parametros... Por ejemplo: edad:22-24 o edad:>30-<20 Os pego el codigo que al final he hecho aunque realmente para este tema solo importa las fechas, por si alguien le puede sacar provecho.

Al final creo haberlo solucionado y el problema no era sumarle un año, era restarle 1 y simplemente con las fechas se puede hacer y un between... aunque puede que algun aspecto me esté dejando...

Código PHP:
Ver original
  1. // EDAD
  2.             // En vez de menor que utilizamos 2 arrobas: @@
  3.             if(($tiposCondiciones[5] == $filtro || $tiposCondicionesGlobal[5] == $filtro) && strlen($valor) > 0){
  4.             $ano = 60*60*24*365;
  5.             echo $partes;
  6.            
  7.             $partes = explode("-", $valor);
  8.             //echo 60*24*365* (int) $partes[0];
  9.             $val = str_replace(">", '', $partes[0]);
  10.             $val = str_replace("@@", '', $val);
  11.                
  12.             $timeEdad1 = time() - ($ano*$val);
  13.             $tE1 = $timeEdad1 - $ano;
  14.            
  15.                 // La primera edad no tenga mayor o menor
  16.                 if(!preg_match("/\>[0-9]{2}$/", $partes[0]) && !preg_match("/@@[0-9]{2}$/", $partes[0])){
  17.                 // No quiere ver un intervalo, una edad exacta             
  18.                 $ampli_sql_edad = " ua.FECHA_NACIMIENTO BETWEEN $tE1 AND $timeEdad1 AND ";
  19.                 $valor_fijo = 1;
  20.                 }else{
  21.                 // Quiere usar intervalos
  22.                     if(preg_match("/\>[0-9]{2}$/", $partes[0])){
  23.                     // Mayor
  24.                     $ampli_sql_edad = " ua.FECHA_NACIMIENTO < $timeEdad1 ";
  25.                     }
  26.                    
  27.                     if(preg_match("/@@[0-9]{2}$/", $partes[0])){
  28.                     // Menor
  29.                     $ampli_sql_edad = " ua.FECHA_NACIMIENTO > $timeEdad1 ";
  30.                     }
  31.                 }
  32.            
  33.            
  34.                 if(count($partes) > 1){
  35.                 $val = str_replace(">", '', $partes[1]); // Quitamos los posibles simbolos
  36.                 $val = str_replace("@@", '',$val);
  37.                 $timeEdad2 = time() - ($ano*$val);
  38.                 $tE2 = $timeEdad2 - $ano;
  39.                
  40.                 // Quiere buscar en otra fecha
  41.                     if(!preg_match("/\>[0-9]{2}$/", $partes[1]) && !preg_match("/@@[0-9]{2}$/", $partes[1])){
  42.                     // Una edad exacta
  43.                         // En caso de que anteriormente se haya buscado por valor fijo, entonces lo que buscamos es un intervalo: 22-24, todos los que tengan de 22 a 24 años.
  44.                         if($valor_fijo == 1){
  45.                             // Miramos cual de los dos es el mayor para poner bien el between
  46.                             if($timeEdad1 > $timeEdad2){
  47.                             $ampli_sql_edad = " ua.FECHA_NACIMIENTO BETWEEN $tE2 AND $timeEdad1 AND ";
  48.                             }else{
  49.                             $ampli_sql_edad = " ua.FECHA_NACIMIENTO BETWEEN $tE1 AND $timeEdad2 AND ";
  50.                             }
  51.                         }else{
  52.                         // No buscaba un valor fijo: >30-24, buscamos todos los mayores de 30 y que tengan 24 exactamente
  53.                         $tE2 = $timeEdad2 - $ano;
  54.                         $ampli_sql_edad = " ($ampli_sql_edad OR ua.FECHA_NACIMIENTO BETWEEN $tE2 AND $timeEdad2) AND ";
  55.                         }
  56.                     }else{
  57.                     // Quiere usar intervalos
  58.                         if(preg_match("/\>[0-9]{2}$/", $partes[1])){
  59.                         // Mayor
  60.                             if($valor_fijo == 1){
  61.                             $ampli_sql_edad.= " ua.FECHA_NACIMIENTO < $timeEdad2 AND ";
  62.                             }else{
  63.                             $ampli_sql_edad = " ($ampli_sql_edad OR ua.FECHA_NACIMIENTO < $timeEdad2) AND ";
  64.                             }
  65.                         }
  66.                        
  67.                         if(preg_match("/@@[0-9]{2}$/", $partes[1])){
  68.                         // Menor
  69.                             if($valor_fijo == 1){
  70.                             $ampli_sql_edad.= " ua.FECHA_NACIMIENTO > $timeEdad2 AND ";
  71.                             }else{
  72.                             $ampli_sql_edad = " ($ampli_sql_edad OR ua.FECHA_NACIMIENTO > $timeEdad2) AND ";
  73.                             }
  74.                         }
  75.                     }
  76.                 }else{
  77.                     if($valor_fijo != 1){
  78.                     $ampli_sql_edad = $ampli_sql_edad.' AND ';
  79.                     }
  80.                 } // Fin if count
  81.                
  82.                
  83.                
  84.                
  85.                
  86.                
  87.             } // Fin if condicion edad

Última edición por leif_sk8er; 31/03/2011 a las 18:48

Etiquetas: edad
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 02:57.