Query en datums

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

N K

N K

10/06/2014 21:06:26
Quote Anchor link
Ik heb een query die kijkt naar het aantal records en ze sorteert op startdatum oplopend.
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?
 
PHP hulp

PHP hulp

25/12/2024 15:05:44
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

10/06/2014 22:21:41
Quote Anchor link
Als ik het goed begrijp wil je uit jouw rijtje overhouden

10 maart 18 maart
19 maart 19 maart

??
 
Erwin H

Erwin H

10/06/2014 22:24:59
Quote Anchor link
Als ik je goed begrijp, dan kan dat ja. En vrij eenvoudig zelfs.
Sorteren op een virtuele kolom die een 0 of 1 is afhankelijk van of de datum tussen die start- en einddatum ligt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT startdatum, einddatum
FROM tabel
ORDER BY IF(zoekdatum BETWEEN startdatum AND einddatum, 0, 1), startdatum, eindatum
 
N K

N K

10/06/2014 22:27:15
Quote Anchor link
Hoi Ger,
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?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

10/06/2014 22:34:33
Quote Anchor link
Dan voeg je een WHERE aan Erwin zijn query toe:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

Vooropgesteld dat start en einddatum date datatype hebben
 
N K

N K

10/06/2014 22:37:53
Quote Anchor link
Ik denk dat ik hem begrijp.
Ik ga het eens uitproberen. Dank!
 
Erwin H

Erwin H

10/06/2014 22:41:30
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT startdatum, einddatum, IF(zoekdatum BETWEEN startdatum AND einddatum, 0, 1) AS sort_waarde
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.
 
N K

N K

10/06/2014 23:41:32
Quote Anchor link
Dit zou hem moeten zijn maar ik krijg een foutmelding:
#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)
PHP script in nieuw venster Selecteer het PHP script
1
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



Toevoeging op 10/06/2014 23:47:48:

Ik heb hem!
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


Dank Ger en Erwin
Gewijzigd op 10/06/2014 23:58:57 door N K
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.