[sql] hoe de de eerstvolgende 10 jarigen selecteren?

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

  • marktm
  • Registratie: Februari 2007
  • Laatst online: 03-07 12:55
Ok, ik heb een klein probleempje met MySQL. Ik heb een database met daarin geboortedata (opgeslagen als DATE). Voor een website wil ik een klein php-scriptje die de eerstvolgende 10 jarigen laat zien.

Probleem: hoe selecteer je de eerstvolgende 10 jarigen? Het volgende scriptje:

SQL:
1
2
3
4
SELECT displayname,DAY(geboortedatum) AS dag, MONTH(geboortedatum) AS maand
FROM n_account,n_lid
WHERE n_lid.id=n_account.lid AND MONTH(geboortedatum) >= MONTH(NOW())
ORDER BY MONTH(geboortedatum),DAY(geboortedatum)


Werkt normaal gesproken wel, behalve in de maanden november en december. Logisch opzich, aangezien er dat jaar nog maar een paar mensen jarig zijn. Hoe los je dit probleem (m.b.v. sql) op? Ik had het eerst met PHP opgelost m.b.v. een forlusje enzo, maar dat is zo lelijk, en het moet vast anders kunnen.
Suggesties?

[ Voor 1% gewijzigd door een moderator op 23-02-2007 15:22 . Reden: Code-tags ]


  • Edmund
  • Registratie: December 2003
  • Niet online
Kan het niet zo:

SQL:
1
2
3
4
5
6
7
SELECT displayname, DAY(geboortedatum) AS dag, MONTH(geboortedatum) AS maand
FROM n_account, n_lid
WHERE n_lid.id=n_account.lid 
AND DAY(CURRENT_DATE()) >= dag
AND MONTH(CURRENT_DATE()) >= maand
ORDER BY geboortedatum 
LIMIT 10


edit: natuurlijk wordt het steeds minder omdat januari kleiner is als december. Maar ik snapte eventjes niet precies wat je bedoelde ;)

[ Voor 45% gewijzigd door een moderator op 23-02-2007 15:22 . Reden: Code-tags ]


  • marktm
  • Registratie: Februari 2007
  • Laatst online: 03-07 12:55
Nou, het probleem is dan nog steeds dat in de maanden november en december het aantal mensen met een geboortedatum dat groter is (dus die jarig zijn tussen Current_date en 31 december ! ) steeds kleiner wordt, en op een gegeven moment dus onder de 10 komt. Op de een of andere manier moet hij dus verder tellen op 1 januari.

  • Edmund
  • Registratie: December 2003
  • Niet online
Mijn toevoeging op mijn voorgaande query:

If (msql_num_rows(query1) < 10)
Doe 2de query met als currentdate = 1 jan
en als limit 10 - msql_num_rows(query1)
en dan de data nog netjes in 1 array zetten.

  • marktm
  • Registratie: Februari 2007
  • Laatst online: 03-07 12:55
Ah, maar dan moet je nog steeds een PHP-fix gebruiken. Kan opzich wel, maar is er geen manier om dat in SQL op te lossen?

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Het gaat niet over de applicatie MySQL maar de taal SQL. Dus WSS -> PRG. Ook pas ik de topictitel aan, 'sql' zegt zo weinig :+

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


  • Marcj
  • Registratie: November 2000
  • Laatst online: 12:49
Hoe heb je de geboortedatum opgeslagen, want het lijk me dat als je gewoon sorteert op datum (indien netjes opgeslagen als date) dat je iets kan doen als:

code:
1
2
3
4
5
SELECT displayname,DAY(geboortedatum) AS dag, MONTH(geboortedatum) AS maand
FROM n_account,n_lid
WHERE n_lid.id=n_account.lid AND geboortedatum > NOW()
ORDER BY geboortedatum
LIMIT 10


Dit zou ook prima over het jaarwisseling goed moeten geen.

Disclaimer: Deze code is uiteraard ongetest :+

[ Voor 7% gewijzigd door Marcj op 22-02-2007 21:48 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 12:48

gorgi_19

Kruimeltjes zijn weer op :9

:? Zoek je nu iedereen op die in de toekomst geboren is?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • marktm
  • Registratie: Februari 2007
  • Laatst online: 03-07 12:55
Nop, helaas niet, want 1 januari is natuurlijk kleiner dan 31 december. Bij het stukje

geboortedatum > NOW()

heb je het probleem dat je die jaarwisseling hebt. Als je alleen naar maand/dag kijkt gaat het niet goed, want 1 januari is dus kleiner dan 31 december. Maar je kunt het jaartal ook niet meenemen, want aangezien je met geboortedata werkt zullen de jaartallen verschillen van 1950 tot 1990 ofzo.

  • marktm
  • Registratie: Februari 2007
  • Laatst online: 03-07 12:55
En inderdaad (reactie op gorgi_19), met die query zoek je inderdaad mensen die in de toekomst geboren zijn :P

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 12:48

gorgi_19

Kruimeltjes zijn weer op :9

SQL:
1
SELECT name, datefield FROM Datetests WHERE (CURRENT_DATE - (datefield - INTERVAL '10' DAY)) YEAR   <>   (CURRENT_DATE - datefield) YEAR;

* gorgi_19 gaat nog even testen of dit wat is; zie ook http://64.233.183.104/sea...&hl=nl&ct=clnk&cd=2&gl=nl :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Marcj
  • Registratie: November 2000
  • Laatst online: 12:49
gorgi_19 schreef op donderdag 22 februari 2007 @ 21:55:
:? Zoek je nu iedereen op die in de toekomst geboren is?
:X Laat maar... Ik dacht ff te simpel :D

Je kunt wel zoiets doen:

code:
1
2
3
4
5
SELECT displayname,DAY(geboortedatum) AS dag, MONTH(geboortedatum) AS maand, ((((MONTH(gebootedatum) - MONTH(NOW()))%12)+12)%12) AS maand_tegaan
FROM n_account,n_lid
WHERE n_lid.id = n_account.lid
ORDER BY maand_tegaan,DAY(geboortedatum)
LIMIT 10


Dit:
code:
1
SELECT MONTH("1990-01-02") AS maand, ((((MONTH("1990-01-02") - MONTH(NOW()))%12)+12)%12) AS maand_tegaan

levert iig hier op: maand: 1, maand_tegaan: 11

edit: Of nog beter:
code:
1
2
3
4
5
SELECT displayname,DAY(geboortedatum) AS dag, MONTH(geboortedatum) AS maand, ((((MONTH(geboortedatum) - MONTH(NOW()))%12)+12)%12) * 31 + (DAY(geboortedatum) - DAY(NOW())) AS dagen_tegaan
FROM n_account,n_lid
WHERE n_lid.id = n_account.lid
ORDER BY dagen_tegaan
LIMIT 10

[ Voor 32% gewijzigd door Marcj op 22-02-2007 22:28 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 13:42
Je moet niet kijken naar dagen en maanden, maar hoeveel dagen de verjaardag in de toekomst ligt, en daar op sorteren. Het verschil in dagen kan je vinden met door de data te converteren naar dagnummers (van 1 t/m 366), en met de modulus-operator kun je een negatief getal omzetten in een positief getal (-10 dagen wordt dan +356 dagen; dat klopt alleen voor schikkeljaren, maar als je alleen sorteert maakt het niet uit).

SQL:
1
ORDER BY (DAYINYEAR(geboortedatum) - DAYINYEAR(NOW()) + 366) MOD 366 ASC

  • marktm
  • Registratie: Februari 2007
  • Laatst online: 03-07 12:55
Kijk, dat zijn de mooie oplossingen waar ik naar op zoek was. Thnx allemaal :)

  • Tigris
  • Registratie: Augustus 2005
  • Laatst online: 03-07 21:29
Is het niet veel handiger om er een timestamp van te maken.

SELECT displayname WHERE UNIX_TIMESTAMP(geboortedatum) >= UNIX_TIMESTAMP(NOW()) LIMIT 10

[ Voor 3% gewijzigd door Tigris op 23-02-2007 14:40 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Tigris schreef op vrijdag 23 februari 2007 @ 14:36:
Is het niet veel handiger om er een timestamp van te maken.

SELECT displayname WHERE UNIX_TIMESTAMP(geboortedatum) >= UNIX_TIMESTAMP(NOW()) LIMIT 10
Dat kan ook gewoon met een datumtype, maar daarmee heb je dus alleen de mensen die in de toekomst geboren worden, zoals gorgi hierboven al zei. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1