Query en datums
Ik wil dit nu anders doen en bekijken of de zoekdatum tussen twee waardes in de database zit.(startdatum en einddatum)
Als dit zo is, toon dit record dan bij de de zoekdatum en ga vervolgens verder met records die een latere datum hebben.
Zoiets als:
Zoek op datum
12 maart
Results
startdatum einddatum
12 maart 12 maart
12 maart 12 maart
10 maart 18 maart
14 maart 16 maart
19 maart 19 maart
Het record van 10 maart t/m 18 maart wil ik dus maar 1x laten voorkomen.
Ik heb het idee dat ik het beste een functie kan maken in mysql die dit berekend maar weet niet hoe en waar ik moet beginnen. Ik denk dat ik onderstaande stappen moet uitvoeren. Kan iemand me hiermee helpen?
Wat ik zou willen:
1) Zit de zoekdatum tussen of is deze gelijk aan deze twee waarden? Zo ja toon deze als eerste in de results.
2) Ga verder met de datums die na de zoekdatum komen.
Kan dit in 1 query?
10 maart 18 maart
19 maart 19 maart
??
Sorteren op een virtuele kolom die een 0 of 1 is afhankelijk van of de datum tussen die start- en einddatum ligt:
Nee ik wil dat rijtje juist krijgen.
Ik zoek nu op startdatum en dat zou dan betekenen dat het record met startdatum 10 maart en einddatum 18 maart weg zou vallen terwijl ik deze juist in de results wil hebben omdat de zoekwaarde in deze datumrange zit.
Toevoeging op 10/06/2014 22:31:06:
@Erwin, dat ziet er interessant uit. Ik wist niet dat je if statements in queries kon opnemen...
Hoe moet ik dit lezen?
Als zoekdatum tussen startdatum en einddatum ligt dan 0 anders 1?
Wat is de naam van die virtuele kolom? Sorteert hij daarop of op startdatum?
Code (php)
1
2
3
4
5
2
3
4
5
SELECT startdatum, einddatum
FROM tabel
WHERE
'2014-03-12' BETWEEN startdatum AND einddatum OR startdatum > '2014-03-12'
ORDER BY IF(zoekdatum BETWEEN startdatum AND einddatum, 0, 1), startdatum, einddatum
FROM tabel
WHERE
'2014-03-12' BETWEEN startdatum AND einddatum OR startdatum > '2014-03-12'
ORDER BY IF(zoekdatum BETWEEN startdatum AND einddatum, 0, 1), startdatum, einddatum
Vooropgesteld dat start en einddatum date datatype hebben
Ik ga het eens uitproberen. Dank!
N K op 10/06/2014 22:27:15:
Als zoekdatum tussen startdatum en einddatum ligt dan 0 anders 1?
Yep, in feite dus gewoon een boolean. En aangezien het oplopend sorteert, komen alle nullen bovenaan te staan.
N K op 10/06/2014 22:27:15:
Wat is de naam van die virtuele kolom? Sorteert hij daarop of op startdatum?
IN dit geval is er geen naam, want die is niet nodig. De kolom bestaat alleen virtueel om op te sorteren. Op deze manier kan je het niet selecteren. Dat kan wel als je het opneemt in de SELECT met een alias en die dan gebruikt voor de sortering:
Code (php)
1
2
3
2
3
SELECT startdatum, einddatum, IF(zoekdatum BETWEEN startdatum AND einddatum, 0, 1) AS sort_waarde
FROM tabel
ORDER BY sort_waarde, startdatum, eindatum
FROM tabel
ORDER BY sort_waarde, startdatum, eindatum
merk overigens op dat ik zoekdatum hier eigenlijk als placeholder gebruik. Die kolom bestaat niet, dus je zal er een echte datum moeten invullen in je echte query.
#1054 - Unknown column 'SORT_WAARDE' in 'where clause'
Als ik de where clause weghaal dan krijg ik ook records erbij die voor de zoekdatum liggen. Ik wil alleen records waarvan de SORT_WAARDE gelijk zijn of groter zijn dan de zoekdatum.
Code (php)
1
2
3
4
2
3
4
SELECT E.STARTDATE,E.ENDDATE, IF(zoekdatum BETWEEN E.STARTDATE AND E.ENDDATE, zoekdatum, e.startdate) AS SORT_WAARDE
FROM event as e
WHERE SORT_WAARDE >= zoekdatum
ORDER BY SORT_WAARDE, E.STARTDATE
FROM event as e
WHERE SORT_WAARDE >= zoekdatum
ORDER BY SORT_WAARDE, E.STARTDATE
Toevoeging op 10/06/2014 23:47:48:
Ik heb hem!
Code (php)
1
2
3
4
2
3
4
SELECT E.STARTDATE,E.ENDDATE, IF(zoekdatum BETWEEN E.STARTDATE AND E.ENDDATE, zoekdatum , e.startdate) AS SORT_WAARDE
FROM event as e
HAVING SORT_WAARDE >= zoekdatum
ORDER BY SORT_WAARDE, E.STARTDATE
FROM event as e
HAVING SORT_WAARDE >= zoekdatum
ORDER BY SORT_WAARDE, E.STARTDATE
Dank Ger en Erwin
Gewijzigd op 10/06/2014 23:58:57 door N K