Toon posts:

[MySQL] sorteren op verjaardag ipv geboortedatum

Pagina: 1
Acties:
  • 174 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik sla verjaardagen als een timestamp op in een tabel, nu wil ik ze laten sorteren op de verjaardag en niet op geboortedag

ORDER by user_birthday ASC

dit werkt niet goed omdat de geboortejaar mee wordt genomen. zo komt 1-05-1983 voor 28-04-1986 en dat moet natuurlijk niet.
hoe kan ik dus sorteren op zoiets als user_birthday/user_birthay-year zodat er wordt gesorteerd op de dag en de maand en niet meer op jaar.

  • nescafe
  • Registratie: Januari 2001
  • Laatst online: 20:55
Heb je al gezocht naar MySQL-datumfuncties, waarbij je afzonderlijk de maand en de dag als expressie kunt opnemen in je ORDER BY-list?

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


  • Brothar
  • Registratie: Oktober 2000
  • Laatst online: 04-02 09:14

Brothar

meester

wat dacht je van een sort op jaar, maand, dag ?
(en hoe dat in mysql gecodeerd moet worden weet ik niet, maar wél dat dit het juiste algoritme is)

eagle


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

al eens naar : "MONTH(user_birthday)+'/'+DAY(user_birthday)" gekeken ?

In principe dus gewoon de date functies van mysql.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • markvt
  • Registratie: Maart 2001
  • Laatst online: 14:41

markvt

Peppi Cola

order by month(datumveld),day(datumveld)

zoiets

van-tilburg.info -=- meka (sega emulator) - Proud MEDION fanclub member - KOPPIG VOLHOUDEN !


Verwijderd

dusty schreef op dinsdag 19 april 2005 @ 19:20:
al eens naar : "MONTH(user_birthday)+'/'+DAY(user_birthday)" gekeken ?

In principe dus gewoon de date functies van mysql.
Dan moet je wel iets doen met voorloopnullen anders komt februari na december...

Je zou dan iets krijgen van:
SQL:
1
RIGHT('0'+MONTH(user_birthday),2)+'/'+RIGHT('0'+DAY(user_birthday),2)

Ik weet niet of MySQL de RIGHT-functie heeft, ik gebruik zelf MS-SQL.

Edit:
De oplossing van Markvt is inderdaad de beste...

[ Voor 12% gewijzigd door Verwijderd op 19-04-2005 19:45 ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

markvt geeft imho de beste uitwerking... Waarom strings maken van getallen, terwijl je rechtstreeks met die getallen kan werken :?

Verwijderd

Topicstarter
kheb het nu zo gedaan
code:
1
$sql = ($board_config['birthday_check_day']) ? "SELECT user_id, username, user_birthday,user_level FROM " . USERS_TABLE. " WHERE user_birthday!=999999 ORDER BY month(user_birthday),day(user_birthday)" :"";


alleen vind ie dan helemaal geen verjaardagen...

ik ga er eens even wat sites op na lezen.. maar reacties zijn natuurlijk nog steeds welkom.

Verwijderd

Topicstarter
hmmz het gekke is dat er in user_birthday een getalletje staat van maar 4 cijfers... hierin zitten dus alle gegevens...

op deze manier wordt de birthday weggeschreven.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Start add - Birthday MOD
    if (isset($HTTP_POST_VARS['birthday']) )
    {
        $birthday = intval ($HTTP_POST_VARS['birthday']);
        if ($birthday!=999999)
        {
            $b_day = realdate('j',$birthday); 
            $b_md = realdate('n',$birthday); 
            $b_year = realdate('Y',$birthday);
        }
    } else
    {
        $b_day = ( isset($HTTP_POST_VARS['b_day']) ) ? intval ($HTTP_POST_VARS['b_day']) : 0;
        $b_md = ( isset($HTTP_POST_VARS['b_md']) ) ? intval ($HTTP_POST_VARS['b_md']) : 0;
        $b_year = ( isset($HTTP_POST_VARS['b_year']) ) ? intval ($HTTP_POST_VARS['b_year']) : 0;
        if ($b_day && $b_md && $b_year)
        {
            $birthday = mkrealdate($b_day,$b_md,$b_year);
        } else
        {
            $birthday = 999999;
        }
    }
// End add - Birthday MOD


wil dus weten hoe ik nu het geboortejaar (vanuit de order by in de sql query) uit dit getal kan halen.

[ Voor 16% gewijzigd door Verwijderd op 19-04-2005 22:11 ]


Verwijderd

Topicstarter
ergens in me config files staat

// 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.

dus dat 4 cijferig getalletje is niet de timestamp maar de timestamp/86400

hoe kan ik hier nou mee rekenen?

[ Voor 4% gewijzigd door Verwijderd op 19-04-2005 22:11 ]


Verwijderd

gewoon met hetzelfde getal weer vermenigvuldigen in de query (dus MONTH(veld*1234))

Verwijderd

Topicstarter
Verwijderd schreef op dinsdag 19 april 2005 @ 22:10:
gewoon met hetzelfde getal weer vermenigvuldigen in de query (dus MONTH(veld*1234))
werkt niet...

kheb het nu zo maar dat klopt ook niet
code:
1
$sql = ($board_config['birthday_check_day']) ? "SELECT user_id, username, user_birthday, user_level FROM " . USERS_TABLE. " WHERE user_birthday!=999999 ORDER BY realdate('md', user_birthday)" :"";


de maand-dag wordt uitgelezen met
code:
1
$user_birthday = realdate('md', $profiledata['user_birthday']);


is er niet een manier om dit op de een of andere manier in de query te stoppen?

[ Voor 24% gewijzigd door Verwijderd op 19-04-2005 22:23 ]


  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 08-05 12:49

thomaske

» » » » » »

dan heb je nog de mysql-functie FROM_UNIXTIME() nodig om een unix timestamp om te zetten naar een mysql date

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • vinnux
  • Registratie: Maart 2001
  • Niet online
Waarom geen drie velden opnemen in je database?
- yearOfBirth AS unsigned mediumint(4) NOT NULL
- monthOfBirth AS unsigned tinyint(2) NOT NULL
- dayBirth AS unsigned tinyint(2) NOT NULL

ORDER BY monthOfBirth, dayBirth geeft dan het gewenste resultaat.

Voor het maken van een datum gebruik ik altijd de volgende functie in php:
PHP:
1
2
3
4
5
6
7
8
function ToDate($dateStr){
    $date = null;
    $parts = split('[^[:digit:]]+',trim($dateStr)) ;
    if (count($parts) === 3 && @checkdate($parts[1],$parts[0],$parts[2])) {
        $date = @mktime(0,0,0,$parts[1],$parts[0],$parts[2]);
    } 
    return $date;
}

Deze functie laat toe dat er alles als scheidingteken gebruikt kan worden behalve nummers.
12gg01kk2004 is dus een goede datum.

Om nu deze velden te vullen neem de in je querie op : yearOfBirth = '.date('Y',$date).', monthOfBirth = '.date('m',$date).', dayOfBirth = '.date('d',$date)

Daarnaast sla je gewoon ook nog de hele datum op in een datum veld. Met zoals gezegd de functie FROM_UNIXTIME()

De overhead en benodigde ruimte is minimaal aangezien je een Date gebruik een geen DateTime of Timestamp. De query snelheid is hoger en het is beter inzichtelijk te krijgen.

[ Voor 41% gewijzigd door vinnux op 20-04-2005 10:39 ]


  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 08-05 12:49

thomaske

» » » » » »

Waarom zou je allerlei trucs gaan uithalen als mysql al voorziet in allerlei datum types en datum functies?

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 04-05 09:32
Je loopt tegen twee 'probleempjes' aan:

1. wat je zelf ook al min of meer zegt, UNIX TIMESTAMP gaat niet verder terug dan 1970, dus niemand mag ouder zijn als 35... je kunt beter kiezen voor bijv. DATE of DATETIME als veldtype.

2. Als je wilt sorteren op bijv. de eerstvolgende verjaardagen, denk er dan even aan dat er na dec. ook weer een jan. komt ;)

Alleen voor het hele jaar een overzicht op geboortedatum:
code:
1
2
select naam, MONTH(user_birthday) as m, DAYOFMONTH(user_birthday)as d from users
order by m,d
Pagina: 1