Hey,

Ik heb een datumveld in m'n datebase. (event_date)
Nu wil ik met ondestaande query alle events ophalen tesamen met het aantal dagen wanneer dat event plaatsvind.
SELECT DATE_FORMAT(CURDATE(),'%d-%m')), DATE_FORMAT(event_date,'%d-%m'), event_short_content,event_long_content, DATEDIFF(DATE_FORMAT(CURDATE(),'%d-%m'),DATE_FORMAT(event_date,'%d-%m')) AS verschil FROM events;

deze geeft helaas NULL terug bij 'verschil'
Gaat dit niet werken of heb ik ergens een fout?

Sorry jongens, maar alle hulp is idd welkom.
Verklaar dan eens waarom deze dan wel werkt:
SELECT *, DATE_FORMAT(CURDATE(),'%j'), DATE_FORMAT(event_date,'%j'), DATE_FORMAT(event_date,'%j') - DATE_FORMAT(CURDATE(),'%j') as verschil FROM events WHERE DATE_FORMAT(event_date,'%j') - DATE_FORMAT(CURDATE(),'%j') < 4 AND DATE_FORMAT(event_date,'%j') - DATE_FORMAT(CURDATE(),'%j') >= 0

En ja, 'leesbare querys', maar heb deze ff geprobeerd en gecopieerd.

Jij zegt van geen date_format in m'n vergelijking. deze lukt dus wel.
Puur toeval. Je selecteert hier met date_format enkel een dag van een jaar. Hoewel dit een string is, zal MySQL het ook kunnen interpreteren als een integer (omdat de string uit enkel getallen bestaat) en er dus mee kunnen rekenen als integer.

Nogmaals, dit is dus puur toeval en ik zou het eerder een bug in MySQL willen noemen dan een functionaliteit.

ps. Dat neemt overigens nog niet weg dat jij het resultaat van de eerste twee DATE_FORMAT()'s in die query, moeilijk kunt uitlezen. Simpelweg omdat je ze geen alias geeft...
Lol
Toeval of nie, ik zou dan wel eens zien hoe m'n 'niet-toevallige' query eruit moet zien :)

dus ik moet alle evenementen hebben die de komende 4 dagen gaan plaatsvinden.
Ben eens benieuwd nu :)

Bedankt alvast
Omdat je daar simpel gezegd uit DATE_FORMAT maar alleen een jaartal krijgt, en daarmee kan je wel verder rekekenen.

Jurgen, neem het nu eens aan, gebruik niet DATE_FORMAT in je vergelijking, die hoort daar niet en is daar niet voor bedoeld. Onderstaand hoe je het (in het geval van de query die dus wel lukt) zou moeten:


SELECT 
    DAYOFYEAR(CURDATE()) AS huidig_dag, 
    DAYOFYEAR(event_date) AS event_dag, 
    DAYOFYEAR(event_date) - DAYOFYEAR(CURDATE()) as verschil 
FROM 
    events 
WHERE 
    DAYOFYEAR(event_date) - DAYOFYEAR(CURDATE()) < 4 
AND 
    DAYOFYEAR(event_date) - DAYOFYEAR(CURDATE()) >= 0


Let wel op, ik heb niet inhoudelijk naar de query gekeken, alleen de juiste MySQL functies gebruikt om de query wel goed te laten zijn.
Probeer het nu eens zo, en ga ook op zo'n manier aan de gang met de andere query.

YEAR(datumveld) -> Geeft jaartal
MONTH(datumveld) -> Geeft maand
DAY(datumveld) -> Geeft dag

Vergelijk de dag en de maand niet in 1 keer, maar doe dat los van elkaar:

WHERE
   MONTH(datumveld) >= 8
AND
    DAY(datumveld) >= 4
    


Met de voorgaande WHERE clause kijk je naar data die na 4 augustus vallen, maar niet naar het jaartal.

[edit]Ik had niet goed gekeken, het moest dayofyear zijn in plaats van year.[/edit]
jurgen schreef op 14.01.2008 11:32
dus ik moet alle evenementen hebben die de komende 4 dagen gaan plaatsvinden.

Zo dus:

SELECT
	event
FROM
	events
WHERE
	DAYOFYEAR(event_date) - DAYOFYEAR(CURDATE()) <= 4

Neem ook eens een kijkje in de MySQL handleiding en let op het subtiele verschil tussen functies als DAY() en DAYOFYEAR(). Verder zul je met deze query nog wel in de knoop komen naarmate het einde van het jaar nadert.

1 - 365 is natuurlijk <= 4, maar 10 - 365 is dat ook. Kortom, alle events van het komende jaar zullen weergegeven worden. Aan jou nu de taak om een extra voorwaarde te stellen zodat dit niet gebeurt.
Dit is dus een geldige query:
SELECT *,
DAYOFYEAR( event_date ) - DAYOFYEAR( CURDATE( ) ) as verschil
from events
WHERE DAYOFYEAR(event_date) - DAYOFYEAR(CURDATE()) <= 4
AND DAYOFYEAR(event_date) - DAYOFYEAR(CURDATE()) > 0

Geef idd terug wat ik wil
Thx nog
Tip: Ga testen.

Zet een hele serie verschillende datums in de database en ga vervolgens de systeemdatum van jouw pc/server aanpassen om verschillende situaties na te bootsen. Alleen een verjaardag op 14 januari testen op 14 januari is niet zo handig. En dan druk ik het heel voorzicht uit!

Daarnaast is MySQL een zeer onbetrouwbare database, die gaat bij het minste of geringste gokken welke data hij vandaag retour geeft. Wanneer jij even niet oplet, lijkt het dat er correcte data retour komt (hé, het werkt! er is data!), maar in werkelijkheid klopt er geen ene mallemoer van. Goed testen is dus een vereiste. Maar ook een vak apart...

Edit:
Geef idd terug wat ik wil

Nogmaals, ga testen. En in dit geval ook met datums ná 28 februari en ook in andere jaren dan 2008. Dat is een schrikkeljaar en heeft dus meer dagen dan de andere jaren.
Dat is wel een geldige query inderdaad.. Maar let ook even op de opmerking van Blanche, die moet je nog wel afvangen.

Probeer nu eens met de informatie die je van ons (in overvloede) hebt gekregen je volgende query op te bouwen.
Je had zo te zien zelf al bedacht dat dat verschil groter moest zijn dan 0. Nu kent de database hier nog een kortere functie voor:

SELECT
	*,
	DAYOFYEAR( event_date ) - DAYOFYEAR( CURDATE( ) ) as verschil
FROM
	events
WHERE
	DAYOFYEAR(event_date) - DAYOFYEAR(CURDATE()) BETWEEN 0 AND 4
Die had ik idd al gevonden Blanche.
Aan allen, bedankt nog voor de support. Ben intussen aan t testen.
Maar was toch eens benieuwd wat deze query gaf in pg

SELECT *, DATE_FORMAT(CURDATE(),'%j'), DATE_FORMAT(event_date,'%j'), DATE_FORMAT(event_date,'%j') - DATE_FORMAT(CURDATE(),'%j') as verschil FROM events WHERE DATE_FORMAT(event_date,'%j') - DATE_FORMAT(CURDATE(),'%j') < 4 AND DATE_FORMAT(event_date,'%j') - DATE_FORMAT(CURDATE(),'%j') >= 0

Ben intussen wel aan het testen met die query die ik van jullie had :)

Reageren