[MySQL] Lastige WHERE-clausules

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

  • Parmenides
  • Registratie: Juni 2003
  • Laatst online: 02-08-2025
Ik wil een lijst met titels en releasedata uit een database halen. Die lijst moet (als we 'm vandaag zouden maken) als volgt zijn opgebouwd:

Titels voor deze week: 30 januari - 5 februari
Titels voor volgende week: 6-12 februari
Titels voor de rest van de maand na volgende week: 13-28 februari
Titels voor de daarop volgende maand: 1-31 maart

Welnu, ik heb dus vier queries met elk een eigen WHERE-clausule:

1. deze week
code:
1
WHERE WEEK(datum) = WEEK(NOW(),1)

2. volgende week
code:
1
WHERE WEEK(datum) = WEEK(NOW(),1)+1

3. de rest van de maand na volgende week
code:
1
2
WHERE MONTH(datum) = MONTH(DATE_ADD(CURDATE(),INTERVAL
+1 MONTH)) AND WEEK(datum) > WEEK(NOW(),1)+1

4. de maand na de maand na volgende week (anders gezegd: de eerste HELE maand na volgende week)
code:
1
2
WHERE MONTH(datum) = MONTH(DATE_ADD(CURDATE(),INTERVAL
+2 MONTH)) AND WEEK(datum) > WEEK(NOW(),1)+1

etc., etc.

De eerste twee zijn appeltje eitje natuurlijk, maar de derde en vierde krijg ik maar niet goed onder de knie. Ik begrijp wel wat ik fout doe (ik tel één of twee maanden bij de huidige datum op), maar kom niet tot een oplossing. Weet iemand deze? Een hint is ook welkom.

[ Voor 52% gewijzigd door Parmenides op 04-02-2006 12:36 ]


Verwijderd

Je moet bij 3
code:
1
Month(datum) = Month(Now)
doen, anders tel je de gehele volgende maand, en niet de rest van deze maand.

bovendien werkt het niet wanneer je over het jaar heen gaat (week 1 != > week 52), dus moet je niet
code:
1
And Week(datum) > Week(now(),1)+1
doen, maar
code:
1
And datum > DATE_ADD(CURDATE(),INTERVAL +1 WEEK)


Wat je met 4 precies wilt bereiken snap ik niet zo. De maand na de maand na volgende week is gewoon de volgende maand in mijn perceptie.

  • Parmenides
  • Registratie: Juni 2003
  • Laatst online: 02-08-2025
Verwijderd schreef op vrijdag 03 februari 2006 @ 22:29:
Je moet bij 3
code:
1
Month(datum) = Month(Now)
doen, anders tel je de gehele volgende maand, en niet de rest van deze maand.
Nee, want dan ga je er vanuit dat de maand waar we ons na volgende week in begeven ALTIJD de maand is waar we ons nu in begeven. En dat is niet altijd zo.
Wat je met 4 precies wilt bereiken snap ik niet zo. De maand na de maand na volgende week is gewoon de volgende maand in mijn perceptie.
Bij de vierde clausule gaat om de titels in de eerste HELE maand na volgende week. Dat hoeft niet per se de maand na vandaag te zijn! Stel: het is vandaag 22 februari. Dan moet de volgende lijst verschijnen:

titels voor 20-26 februari
titels voor 27 februari - 5 maart
titels voor 6-31 maart
titels voor 1-30 april

Met jouw clausule krijg ik in het vierde resultaat niet gegevens voor 1-30 april, maar gegevens voor 1-31 maart!

[ Voor 16% gewijzigd door Parmenides op 05-02-2006 10:24 ]


Verwijderd

Parmenides schreef op vrijdag 03 februari 2006 @ 22:43:
[...]
Nee, want dan ga je er vanuit dat de maand waar we ons na volgende week in begeven ALTIJD de maand is waar we ons nu in begeven. En dat is niet altijd zo.
Dan zou je voor
code:
1
2
MONTH(datum) = MONTH(DATE_ADD(CURDATE(),INTERVAL
+1 WEEK))
moeten gaan?

  • Parmenides
  • Registratie: Juni 2003
  • Laatst online: 02-08-2025
Verwijderd schreef op vrijdag 03 februari 2006 @ 22:47:
Dan zou je voor
code:
1
2
MONTH(datum) = MONTH(DATE_ADD(CURDATE(),INTERVAL
+1 WEEK))
moeten gaan?
Al eerder geprobeerd, maar dat levert dus een foutmelding op. MONTH en WEEK botsen daar met elkaar.

  • Parmenides
  • Registratie: Juni 2003
  • Laatst online: 02-08-2025
Dus niemand hier kan 'de rest van de maand na volgende week' en 'de eerstvolgende hele maand' definiëren? Lekker dan.

@freewilly: je opmerking dat de eerste where-clausule
code:
1
Week(datum) > Week(now(),1)+1
problemen geeft bij de jaarwisseling is terecht. Maar hoe dit op te lossen? Met
code:
1
datum > DATE_ADD(CURDATE(),INTERVAL +1 WEEK)
kom ik er ook niet. En
code:
1
WEEK(datum) = WEEK(DATE_ADD(CURDATE(), INTERVAL 1 WEEK))
geeft een foutmelding. Interval 1 week schijnt niet te mogen.

Dacht ik eerst nog 2 clausulen goed te hebben, nu zijn ze alle 4 fout. :'(

Verwijderd

DATE_ADD
Gebruik 7 DAYS i.p.v. 1 WEEK...

[ Voor 19% gewijzigd door Verwijderd op 06-02-2006 09:57 ]


  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Laatste dag van de maand:
SELECT LAST_DAY('2003-02-05'); -> '2003-02-28'

Eerste dag van de volgende maand:
SELECT DATE_ADD(LAST_DAY('2003-02-05'),INTERVAL 1 DAY); -> '2003-03-01'

Laatste dag volgende maand....kan je op basis van bovenstaande informatie zelf deduceren....of zoek het op in de manual http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html.

When life gives you lemons, start a battery factory

Pagina: 1