[mysql] eerste x verjaardagen uit DB

Pagina: 1
Acties:

  • Sosabowski
  • Registratie: Juni 2003
  • Laatst online: 18-04 11:49
Ik heb al gezocht en deze doorgelezen maar ik kom niet verder dan dit:

PHP:
1
2
3
4
SELECT timeline.event, timeline.datum, date_format(datum, '%m%d') AS dag,   
       sign(date_format(datum,'%m%d')   - date_format(sysdate(),'%m%d')) AS test
FROM timeline
ORDER BY test desc, dag ASC


Dit geeft wel de eerste verjaardagen maar alleen van dit jaar. maw op 30 dec zie je niks als de eerste verjaardagen weer in january vallen.

Wie helpt mij met deze kl#te query? Of is het uberhaupt mogelijk? :?

Relevante info:
PHP:
1
2
3
4
5
6
7
8
9
#
# Tabel structuur voor tabel `timeline`
#
CREATE TABLE `timeline` (
  `event_ID` int(11) NOT NULL auto_increment,
  `datum` date NOT NULL default '0000-00-00',
  `event` varchar(80) NOT NULL default '',
  PRIMARY KEY  (`event_ID`)
) TYPE=MyISAM AUTO_INCREMENT=15 ;

The whole problem with the world is that fools and fanatics are always so certain of themselves, and wiser people so full of doubts. -- Bertrand Russell


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Uhm....Ik ken MySQL amper, ik gebruik zelf MSSQL. Maar als de volgende pseudo-code (jaja, 't zijn queries; I know) zou je op weg moeten helpen...

Pseudo
code:
1
...Where BirthDay >= Today and BirthDay < DateAdd(m,3,Today)


voor de komende 3 maanden of

Pseudo
code:
1
2
Select Top 10...
...Where BirthDay >= Today

Voor eerstvolgende 10 verjaardagen...

edit:
En die eerste kan nog mooier:
Pseudo
code:
1
...Where BirthDay Between (Today and DateAdd(m,3,Today))


Overigens is het denk ik makkelijker de geboortedatum op te slaan, en zelf "uit te rekenen" wanneer de volgende is (en hoe oud die persoon wordt dan). Nu moet je zelf steeds je verjaardagen in je timeline tabel gooien. Niet erg praktisch toch?

[ Voor 81% gewijzigd door RobIII op 15-12-2003 21:28 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Sosabowski
  • Registratie: Juni 2003
  • Laatst online: 18-04 11:49
Nope, als ik jou goed begrijp gaat dit niet werken.
In de database staan de geboortedatums en in wil de eerstkomende verjaardagen. (zie ook het linkje)
Dat werkt op zich wel alleen zie je niet de verjaardagen voorbij 31 dec.

[ Voor 20% gewijzigd door Sosabowski op 15-12-2003 21:32 ]

The whole problem with the world is that fools and fanatics are always so certain of themselves, and wiser people so full of doubts. -- Bertrand Russell


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Een query, overgenomen uit Celko's SQL for Smarties, waar je wellicht wat aan hebt:
code:
1
2
3
4
5
6
7
8
SELECT
  naam, verjaardag
FROM
  verjaardagen
WHERE 
  INTERVAL (CURRENT_DATE - verjaardag) YEAR
      <
       INTERVAL (CURRENT_DATE - (verjaardag + INTERVAL 45 DAYS)) YEAR

Oftewel:
selecteer iedereen die over een 45 dagen een jaar ouder is (dus binnen die 45 dagen jarig is).

Zoiets kan je zelf ook gebruiken door te kijken naar hoeveel dagen 'vanaf vandaag' iemand jarig is en daardoor op te sorteren, ala:
code:
1
2
3
4
5
6
7
8
9
10
11
SELECT
  naam,
  verjaardag,
  (verjaardag + (INTERVAL (CURRENT_DATE - verjaardag) YEAR)) - CURRENT_DATE
      as days_from_now
FROM 
  verjaardagen
WHERE
  (verjaardag + (INTERVAL (CURRENT_DATE - verjaardag) YEAR)) > CURRENT_DATE
ORDER BY
  days_from_now

Ongetest :)

edit:

De where meegenomen, ik ben alleen niet zeker of ie wel nodig is :o

[ Voor 23% gewijzigd door ACM op 15-12-2003 21:37 . Reden: - vervangen door +, jaren optellen, niet aftrekken ]


  • Sosabowski
  • Registratie: Juni 2003
  • Laatst online: 18-04 11:49
Ok, ik begrijp wat ongeveer de bedoeling is maar die functie interval heeft dan toch meerdere argumenten nodig? linkje naar mysql.com

edit:
Voor je eerst query krijg ik de volgende foutmelding:
code:
1
2
3
You have an error in your SQL syntax. 
Check the manual that corresponds to your MySQL server version for the right syntax to use near 
'< INTERVAL (CURRENT_DATE - (datum + INTERVAL 45 DAYS)) YEAR' at

[ Voor 44% gewijzigd door Sosabowski op 15-12-2003 22:03 ]

The whole problem with the world is that fools and fanatics are always so certain of themselves, and wiser people so full of doubts. -- Bertrand Russell


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

inteval is geen functie, maar een tijdstype, mysql ondersteund dat niet zo handig en ik krijg het atm ook in postgresql niet aan de praat (bovenstaande is wat de standaard zou moeten accepteren, afaik, iig volgens Celko en die was bij het ontwikkelen van de standaard betrokken)

in mysql zul je waarsch met date_sub / date_add moeten werken ipv de +'s en -'s van intervals

dus date_add(datum, INTERVAL 45 DAYS) in het geval van bovenstaande query.

  • Sosabowski
  • Registratie: Juni 2003
  • Laatst online: 18-04 11:49
Helaas,
Ik krijg het hier ook helemaal niet aan de praat. Mochten mensen nog ideeen hebben, ik hoor het graag. ACM bedankt!

The whole problem with the world is that fools and fanatics are always so certain of themselves, and wiser people so full of doubts. -- Bertrand Russell


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ok, even geklooid met mysql...

WAT een wazig product is het ook :X
code:
1
2
3
4
5
6
7
8
SELECT
 naam,
 datum,
 date_add(datum, interval FLOOR((current_date - datum)/10000) year) - current_date
    as weird_timestamp
FROM
 verjaardagen
ORDER BY weird_timestamp


Die /10000 was bij mij nodig omdat mysql een of ander suf getal van 6 cijfers teruggaf bij het aftrekken van de verjaardagen van de huidige datum, wat het getal precies moet voorstellen zou ik niet weten iig, de voorste twee kwamen overeen met de leeftijd van de betreffende testpersonen :X
En het resultaat van de aftrekking van de "laatst gebeurde verjaardag" - "de huidige datum" geeft helemaal een bizar resultaat :X

Overigens ook nog een postgresql voorbeeld:
code:
1
2
3
4
5
6
7
SELECT
 naam,
 verjaardag,
 (verjaardag + date_trunc('year', age(verjaardag))) - current_date
     AS days_from_now
FROM verjaardagen
ORDER BY days_from_now


De queries geven dus de sortering op basis van "hoe lang de verjaardag geleden was".

[ Voor 12% gewijzigd door ACM op 15-12-2003 23:21 ]


  • Sosabowski
  • Registratie: Juni 2003
  • Laatst online: 18-04 11:49
_/-\o_ _/-\o_ _/-\o_ Bedankt!
Het ziet er in iedergeval uit als iets waar ik zelf nooit op was gekomen.
Morgen testen!! :z

The whole problem with the world is that fools and fanatics are always so certain of themselves, and wiser people so full of doubts. -- Bertrand Russell


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

code:
1
2
3
4
5
6
7
8
SELECT
 naam,
 datum,
 date_add(datum, interval EXTRACT(YEAR FROM FROM_DAYS(TO_DAYS(current_date) - TO_DAYS(datum))) year)
     - current_date as weird_timestamp
FROM
 verjaardagen
ORDER BY weird_timestamp

Iets aangepast, nal mijn bugreport bij mysql

  • Sosabowski
  • Registratie: Juni 2003
  • Laatst online: 18-04 11:49
Het werkt!
Ik had bijna de hoop opgegeven dat het niet zonder php loops kon maar dankzij ACM ( _/-\o_ ) toch gelukt!

P.S. idd raar programma dat MySQL

The whole problem with the world is that fools and fanatics are always so certain of themselves, and wiser people so full of doubts. -- Bertrand Russell

Pagina: 1