Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: ricerca per età

  1. #1
    Utente di HTML.it L'avatar di diaz
    Registrato dal
    Apr 2000
    residenza
    Berlin
    Messaggi
    379

    ricerca per età

    dovrei fare una ricerca per età in un campo di un database in cui però non c'è l'età, bensì la data di nascita creata con una funzione.

    es, dovrei cercare gli iscritti, le cui età siano maggiori ai 25 anni
    e diciamo che nel campo data_nascita ho '6999'


    non so dove mettere le mani
    So che per la query bisognera fare

    ... WHERE data_nascita => '$data_da_trovare'

    ma come faccio a tirare fuori la variabile $data_da_trovare ?
    E da quel giorno, se andavo da qualche parte, io ci andavo correndo!

    Tweeting @apphancer | Views my own – except when I say things I don’t really think.

  2. #2
    Scusa ma 6999 da dove viene fuori?

    Scopri come si arriva a quel dato e avrai la soluzione! :master:

  3. #3
    Utente di HTML.it L'avatar di diaz
    Registrato dal
    Apr 2000
    residenza
    Berlin
    Messaggi
    379
    la seguente funzione, il fatto è che non so come si fa a fare il contrario, cioè ottenere la data avendo un'età

    Codice PHP:
    // Add function mkrealdate for Birthday MOD
    // the originate php "mktime()", does not work proberly on all OS, especially when going back in time
    // before year 1970 (year 0), this function "mkrealtime()", has a mutch larger valid date range,
    // from 1901 - 2099. it returns a "like" UNIX timestamp divided by 86400, so
    // calculation from the originate php date and mktime is easy.
    // mkrealdate, returns the number of day (with sign) from 1.1.1970.

    function mkrealdate($day,$month,$birth_year)
    {
        
    // range check months
        
    if ($month<|| $month>12) return "error";
        
    // range check days
        
    switch ($month)
        {
            case 
    1: if ($day>31) return "error";break;
            case 
    2: if ($day>29) return "error";
                
    $epoch=$epoch+31;break;
            case 
    3: if ($day>31) return "error";
                
    $epoch=$epoch+59;break;
            case 
    4: if ($day>30) return "error" ;
                
    $epoch=$epoch+90;break;
            case 
    5: if ($day>31) return "error";
                
    $epoch=$epoch+120;break;
            case 
    6: if ($day>30) return "error";
                
    $epoch=$epoch+151;break;
            case 
    7: if ($day>31) return "error";
                
    $epoch=$epoch+181;break;
            case 
    8: if ($day>31) return "error";
                
    $epoch=$epoch+212;break;
            case 
    9: if ($day>30) return "error";
                
    $epoch=$epoch+243;break;
            case 
    10: if ($day>31) return "error";
                
    $epoch=$epoch+273;break;
            case 
    11: if ($day>30) return "error";
                
    $epoch=$epoch+304;break;
            case 
    12: if ($day>31) return "error";
                
    $epoch=$epoch+334;break;
        }
        
    $epoch=$epoch+$day;
        
    $epoch_Y=sqrt(($birth_year-1970)*($birth_year-1970));
        
    $leapyear=round((($epoch_Y+2) / 4)-.5);
        if ((
    $epoch_Y+2)%4==0)
        {
    // curent year is leapyear
            
    $leapyear--;
            if (
    $birth_year >1970 && $month>=3$epoch=$epoch+1;
            if (
    $birth_year <1970 && $month<3$epoch=$epoch-1;
        } else if (
    $month==&& $day>28) return "error";//only 28 days in feb.
        //year
        
    if ($birth_year>1970)
            
    $epoch=$epoch+$epoch_Y*365-1+$leapyear;
        else
            
    $epoch=$epoch-$epoch_Y*365-1-$leapyear;
        return 
    $epoch;

    E da quel giorno, se andavo da qualche parte, io ci andavo correndo!

    Tweeting @apphancer | Views my own – except when I say things I don’t really think.

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Se hai le date salvate nel formato AAAA-MM-GG
    codice:
    select * from tabella where 
    ( YEAR(CURRENT_DATE)-YEAR(campo_data))- ( RIGHT(CURRENT_DATE,5)< RIGHT(campo_data,5) ) >= 25
    trova le persone con almeno 25 anni

  5. #5
    Utente di HTML.it L'avatar di diaz
    Registrato dal
    Apr 2000
    residenza
    Berlin
    Messaggi
    379
    è proprio questo il problema non so come risalire al formato della data per poter fare la differenza tra la data attuale e quella di 25 anni fa (per esempio).
    E da quel giorno, se andavo da qualche parte, io ci andavo correndo!

    Tweeting @apphancer | Views my own – except when I say things I don’t really think.

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Originariamente inviato da diaz
    è proprio questo il problema non so come risalire al formato della data per poter fare la differenza tra la data attuale e quella di 25 anni fa (per esempio).
    scusa, ma in che formato è salvata nel db? hai un unix_timestamp o cos'altro?

  7. #7
    Utente di HTML.it L'avatar di diaz
    Registrato dal
    Apr 2000
    residenza
    Berlin
    Messaggi
    379
    il campo del database è un integer (11)
    è una tabella del forum di phpbb, purtroppo non l'ho potuto fare io...
    E da quel giorno, se andavo da qualche parte, io ci andavo correndo!

    Tweeting @apphancer | Views my own – except when I say things I don’t really think.

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    quindi le date sono salvate in formato unix_timestamp.
    una cosa del genere 1149112800 insomma?

  9. #9
    Utente di HTML.it L'avatar di diaz
    Registrato dal
    Apr 2000
    residenza
    Berlin
    Messaggi
    379
    in parte è vero, però sulla spiegazione della funzione mkrealdate c'è scritto:
    mktime non funziona correttamente su tutti gli OS, soprattutto andando indietro con gli anni, per esempio 1970 (anno 0)
    la funzione mkrealtime() ha un raggion ben più vasto da 1901 a 2099.
    Questa funzione produce a "like" UNIX timestamp diviso per 86400....
    E da quel giorno, se andavo da qualche parte, io ci andavo correndo!

    Tweeting @apphancer | Views my own – except when I say things I don’t really think.

  10. #10
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Scusa, mi erano sfuggiti i commenti alla funzione. Non avevo mai visto un formato del genere quindi non saprei che dirti.

    edit. Se il campo data è pari all'unix_timestamp / 86400 prova a fare così

    codice:
    select * from tabella where 
    ( YEAR(CURRENT_DATE) - FROM_UNIXTIME(nome_campo*86400,"%Y") ) - 
    ( RIGHT(CURRENT_DATE,5) < FROM_UNIXTIME(nome_campo*86400,"%m-%d") ) >= 25

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.