Toon posts:

[MySQL] vraag over datum query

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een vraag over een query waar ik niet helemaal uit kom. Ik heb een agenda tabel waar agendapunten in staan. Er moet een query worden gemaakt die de aankomende 4 agendapunten weer geeft, dus met de datum het dichts bij de datum van vandaag. De tabel agenda ziet er als volgt uit:

--------------------------------------
id | uniek id
m | maand van agendapunt
d | dag van agendapunt
y | jaar van agendapunt
text | inhoud van agendapunt

Er zit geen veld datum in.. dit is gesplits in m, d, y velden.. Er moet dus iets zijn dat er van de waarden van de m, d, y velden een datum wordt gemaakt. Hoe moet dit?

Verwijderd

Mag ik vragen waarom je geen datumveld gebruikt?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 26-05 22:23

NMe

Quia Ego Sic Dico.

Ehm, je hebt waarschijnlijk helemaal niets te maken met data. Als het id een auto_increment is, dan zijn de 4 hoogste id's altijd de laatste nieuwe.
code:
1
2
3
4
5
SELECT *
FROM agendatabel
WHERE 1
ORDER BY id DESC
LIMIT 0,4

Zoiets zou moeten volstaan.

/me Moet leren lezen...

Waarom heb je trouwens geen gewoon datumveld?

[ Voor 12% gewijzigd door NMe op 05-03-2004 12:45 ]

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


Verwijderd

Topicstarter
Nou.. ik heb van iemand een agendasysteem geleend en die heeft het zo geprogrammeerd.. je kunt dan per maand zien wat je te doen hebt.. met tijden en omschrijvingen er bij. Dit is dus niet in een datum veld gedrukt om het zo makkelijker te maken om de agendapunten op het scherm te schrijven..

Nee.. de eerste 4 id's betekend niet dat het de eerste agendapunten zijn..

[ Voor 12% gewijzigd door Verwijderd op 05-03-2004 12:45 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 26-05 22:23

NMe

Quia Ego Sic Dico.

Maak er gewoon een datum veld van. Mocht je ooit de maand nodig hebben dan zijn daar hele fijne functies voor, zoals bijvoorbeeld deze:
code:
1
2
3
SELECT *
FROM jouwagendatabel
WHERE MONTH(jouwdatumveld) = 12

Dit zou alle agendapunten van december laten zien.
Verwijderd schreef op 05 maart 2004 @ 12:44:
Nee.. de eerste 4 id's betekend niet dat het de eerste agendapunten zijn..
Vandaar mijn wijziging en strikeout van de tekst. ;)

[ Voor 31% gewijzigd door NMe op 05-03-2004 12:48 ]

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


  • sjoerdb2
  • Registratie: Juli 2001
  • Laatst online: 09-05-2025
NMe84 schreef op 05 maart 2004 @ 12:43:
Ehm, je hebt waarschijnlijk helemaal niets te maken met data. Als het id een auto_increment is, dan zijn de 4 hoogste id's altijd de laatste nieuwe.
code:
1
2
3
4
5
SELECT *
FROM agendatabel
WHERE 1
ORDER BY id DESC
LIMIT 0,4

Zoiets zou moeten volstaan.

/me Moet leren lezen...

Waarom heb je trouwens geen gewoon datumveld?
Ik denk niet dat dit kan werken aangezien je ook afspraken in de toekomst kunt plannen.

Als je dus doet:

PHP:
1
2
3
4
5
6
7
8
$jaar = date(y);
$maand = date(m);
$dag = date(d);
$query = "SELECT *
FROM agendatabel
WHERE y > $maand AND m > $maand AND d > $dag
ORDER BY y,m,d ASC
LIMIT 0,4";


zal het wel goed gaan

[ Voor 18% gewijzigd door sjoerdb2 op 05-03-2004 12:52 ]


Verwijderd

Topicstarter
Mm ja.. das wel een slimme.. eerst sorteren om jaar, dan maand en dan dag.. even kijken of het werkt.. bedankt al vast

Verwijderd

NMe84 schreef op 05 maart 2004 @ 12:43:
Ehm, je hebt waarschijnlijk helemaal niets te maken met data. Als het id een auto_increment is, dan zijn de 4 hoogste id's altijd de laatste nieuwe.
Agendapunten worden niet op volgorde ingevoerd lijkt me. Dus de hoogste id is niet noodzakelijk de laatste afspraak, alleen de nieuwste...

Misschien zoiets?
code:
1
2
3
4
5
6
SELECT veld1, veld2 
FROM agenda
WHERE maand >= MONTH(NOW())
AND jaar >= YEAR(NOW())
ORDER BY jaar, maand, dag
LIMIT 0,4


Edit: te lang bezig geweest met typen. Deze controleert de maand en het jaar (afspraken uit vorige jaren?)

[ Voor 11% gewijzigd door Verwijderd op 05-03-2004 12:50 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 26-05 22:23

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 05 maart 2004 @ 12:48:
Agendapunten worden niet op volgorde ingevoerd lijkt me. Dus de hoogste id is niet noodzakelijk de laatste afspraak, alleen de nieuwste...

Misschien zoiets?
code:
1
2
3
4
5
6
SELECT veld1, veld2 
FROM agenda
WHERE maand >= MONTH(NOW())
AND jaar >= YEAR(NOW())
ORDER BY jaar, maand, dag
LIMIT 0,4
Dat zou inderdaad werken. Maar feit blijft dat het handiger is een datumveld te gebruiken. Mede omdat je dan makkelijker de datum kan formatteren met PHP (ervan uitgaande dat TS dat gebruikt).

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


Verwijderd

NMe84 schreef op 05 maart 2004 @ 12:50:
[...]

Dat zou inderdaad werken. Maar feit blijft dat het handiger is een datumveld te gebruiken. Mede omdat je dan makkelijker de datum kan formatteren met PHP (ervan uitgaande dat TS dat gebruikt).
Precies. Maar misschien is TS niet in staat om de structuur van db te wijzigen? Bestaande applicatie?

Verwijderd

Topicstarter
Nee precies... ik kan de database structuur niet aanpassen.. maar de oplossing van NMe84 werkt prima.. heel erg bedankt hier voor!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 26-05 22:23

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 05 maart 2004 @ 12:55:
Nee precies... ik kan de database structuur niet aanpassen.. maar de oplossing van NMe84 werkt prima.. heel erg bedankt hier voor!
Eerder de oplossing van selfemployed lijkt me... ;)

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


Verwijderd

Topicstarter
Een beetje een late reactie maar vandaag kwam ik er achter dat de aangeboden oplossing niet helemaal goed werkt. Het gaat fout wanneer als er bijvoorbeeld een agendapunt in de database staat van 11-03-2004. Deze wordt door de query wel getoond terwijl de datum 25-03-2004 is. Dit is ook niet apart ofzow.. de maand is groter of gelijk aan de datum van vandaag en het jaar net zo.

Er moet dus nog iets in komen dat de dag groter of gelijk is aan de dag van vadaag. Maar wanneer ik dit doe worden alle agendapunten die de volgendemaand zijn maar eerder dan de dag van vandaag (dus bijvoorbeeld 12-04-2004) niet getoond.. Iemand een idee hoe ik dit moet oplossen??

code:
1
2
3
4
SELECT * FROM agenda 
WHERE d >= DAY(NOW()) AND m >= MONTH(NOW()) AND y >= YEAR(NOW()) 
ORDER BY y, m, d 
LIMIT 0,4

Verwijderd

Topicstarter
Niemand een idee?

  • bartware
  • Registratie: Juni 2001
  • Laatst online: 25-03-2023

bartware

@jabber.org

Hint, kijk eens op:
http://www.mysql.com/docu...l#Date_and_time_functions

Om met data (datums) te rekenen is het het handigst om eerst je kolommen om te zetten in een DATE:

code:
1
2
3
4
5
SELECT *
FROM agenda 
WHERE STR_TO_DATE(d||m||y, '%d%m%Y') >= NOW()
ORDER BY datum
LIMIT 0,4;


Bijvoorbeeld. Geen idee of dit syntactisch helemaal klopt, want ik heb hier geen MySQL ter beschikking.

Heb ik me begrepen?
Cycle Vision 2020: 17-20 juli Sportpark Sloten & Wheelerplanet Spaarnwoude


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 26-05 00:01

Janoz

Moderator Devschuur®

!litemod

Het gaat ook fout waneer je op 31-12 bent. Dan zie je niet de eerste 4 punten van het volgende jaar.

Gebruik gewoon een datum veld (door de DB te veranderen of door een truukje vergelijkbaar met die van bartware)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1