Toon posts:

[SQL] Controle of datum tussen 2 data voorkomt.

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

Verwijderd

Topicstarter
Ik heb dus een tabel met boekingen, hierin staan naast allerlei andere gegevens 2 data in.

Bijvoorbeeld datumvanaf : 2007-2-15 en datumtot : 2007-2-25.

Ik dus nu controleren of een nieuwe boeking binnen deze 2 data invalt.

Dus of de 1 er tussen valt of de ander. Dan is deze dus niet beschikbaar.


Ik had deze al geprobeerd :

SELECT accomodatieid FROM boekingen WHERE '2007-2-20' BETWEEN datumvanaf AND datumtot;

en deze

SELECT accomodatieid FROM boekingen WHERE datumvanaf >= '2007-2-26' AND datumvanaf <= '2007-3-4' AND datumtot >= '2007-2-26' AND datumtot <= '2007-3-4';

Maar krijg hier geen duidelijke en betrouwbare informatie uit, kan iemand mij vertellen wat ik fout doe of fout denk.

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 09:38
De datum moet je sowieso omzetten naar iets in de vorm yyyymmdd, dan kan de between werken. (weet zo niet de syntax maar daar kom je wel uit)

/edit

code:
1
SELECT * FROM boekingen WHERE date BETWEEN 20060815 AND 20070104

[ Voor 25% gewijzigd door _eXistenZ_ op 09-02-2007 09:46 ]

There is no replacement for displacement!


Verwijderd

wat noem je onduidelijk en onbetrouwbaar? die bovenste query lijkt me aardig beproefd. Is datumvanaf en datumtot altijd gevuld? Want als dat niet zo is zou je onverwachte restultaten kunnen krijgen.
Die onderste query is omslachtig en onzin.

welke database is dit trouwens? en zijn die datums als DATE of CHAR/VARCHAR2 oid gedefinieerd?

[ Voor 16% gewijzigd door Verwijderd op 09-02-2007 09:45 ]


Verwijderd

Topicstarter
Verwijderd schreef op vrijdag 09 februari 2007 @ 09:44:
wat noem je onduidelijk en onbetrouwbaar? die bovenste query lijkt me aardig beproefd. Is datumvanaf en datumtot altijd gevuld? Want als dat niet zo is zou je onverwachte restultaten kunnen krijgen.
Die onderste query is omslachtig en onzin.

welke database is dit trouwens? en zijn die datums als DATE of CHAR/VARCHAR2 oid gedefinieerd?
Mysql database, en ze staan idd in een DATE vorm

Verwijderd

Topicstarter
_eXistenZ_ schreef op vrijdag 09 februari 2007 @ 09:43:
De datum moet je sowieso omzetten naar iets in de vorm yyyymmdd, dan kan de between werken. (weet zo niet de syntax maar daar kom je wel uit)

/edit

code:
1
SELECT * FROM boekingen WHERE date BETWEEN 20060815 AND 20070104
Dat gaat idd beter, maar als ik nou 2 velden wilt controleren, dus de begindatum en de einddatum.

SELECT * FROM boekingen WHERE 20070220 BETWEEN datumvanaf AND datumtot OR 20070223 BETWEEN datumvanaf AND datumtot krijg alle records uit de tabel

Verwijderd

weet niet welke data er in de tabel staat, maar als aan één van de voorwaarden voldaan wordt, haalt hij het record op. Zijn er records waarvan je zeker weet dat die niet aan één van de voorwaarden voldoen?

Verwijderd

Topicstarter
Verwijderd schreef op vrijdag 09 februari 2007 @ 10:10:
weet niet welke data er in de tabel staat, maar als aan één van de voorwaarden voldaan wordt, haalt hij het record op. Zijn er records waarvan je zeker weet dat die niet aan één van de voorwaarden voldoen?
Ja , dat zou kunnen, dat de een er wel binnen valt en de ander niet ;)

Verwijderd

ik bedoelde dus: records waarvan je zeker weet dat ze buiten je selectie vallen.

Verwijderd

Topicstarter
Verwijderd schreef op vrijdag 09 februari 2007 @ 10:29:
ik bedoelde dus: records waarvan je zeker weet dat ze buiten je selectie vallen.
Nee, ze moeten allemal gecontroleerd worden, en soms valt een data er binnen en de ander niet, dus je hebt ook overlappingen.

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 10:34

Dido

heforshe

Je zegt dat je alle records terugkrijgt. Is dat wel fout?

Met andere woorden, zijn er wel records die je niet terug zou moeten krijgen?

Je beantwoord die vraag nu al twee keer niet, terwijl hij toch vrij relevant is.

Wat betekent mijn avatar?


Verwijderd

Topicstarter
Dido schreef op vrijdag 09 februari 2007 @ 10:39:
Je zegt dat je alle records terugkrijgt. Is dat wel fout?

Met andere woorden, zijn er wel records die je niet terug zou moeten krijgen?

Je beantwoord die vraag nu al twee keer niet, terwijl hij toch vrij relevant is.
Ok sorry ik zal wat duidelijker zijn.

Deze query wordt gebruikt in een subquery, de velden die hij teruggeeft, die dus overlappen over waar een datum tussen valt, daarvan worden de accomodaties niet van weergegeven, omdat deze dus bezet zijn.

Dus de records die ik niet terug zou moeten krijgen zijn dus de wel beschikbare accomodaties waar van de data die ik controleer of die er tussen zitten, of eventueel overlappen.

Dus ik wil in het voorbeeld :

Accomodatieid : 1 datumvanaf : 20070220 datumtot 20070223

Wanener iemand wilt boeken van 20070219 tot 20070234 vallen deze data er niet tussen, maar overlappen.

Dus ik wil graag een query waar gecontroleerd word of een van de 2 data er tussen valt, en of de data wordt overlapt want dan is de accomodatie ook niet beschikbaar.

Ik hoop dat ik duidelijk ben geweest, zoniet vraag maar raak :)

Alvast bedankt

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
datumvanaf moet kleiner zijn dan het einde van de periode EN datumtot moet groter zijn dan het begin van de periode. Dit klinkt misschien wat tegenintuitief, maar teken het anders maar, dit is gewoon de oplossing. :Y)

{signature}


Verwijderd

Topicstarter
Voutloos schreef op vrijdag 09 februari 2007 @ 10:56:
datumvanaf moet kleiner zijn dan het einde van de periode EN datumtot moet groter zijn dan het begin van de periode. Dit klinkt misschien wat tegenintuitief, maar teken het anders maar, dit is gewoon de oplossing. :Y)
Ok bedankt, en als ik dan er ook nog een tijd bij wilt, kan ik deze ook gebruiken met BETWEEN ?

OF kan ik dan beter een timestamp gaan gebruiken ?

[ Voor 5% gewijzigd door Verwijderd op 09-02-2007 13:19 ]


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Nee, je wil dus geen between. Je wil a kleiner dan y, b groter dan x, dus between gaat niet op. Als je die vergelijkingen doet met een datatypes waar ook tijd bij zit ben je er. :)

{signature}


Verwijderd

ja, timestamp klinkt zinnig.
Timestamps zijn zinvol als je de tijd altijd samen met de datum gebruikt (om te query-en), en niet als apart gegeven. Voor het vergelijken van tijden zonder de datum is de index van de timestamp namelijk niet geschikt. (als je dus wilt analyseren wie er de afgelopen 10 jaar later dan 22:00 aankwam ofzo)

Volgens mij kun je best BETWEEN gebruiken, maar dan AND (ipv OR).
code:
1
2
3
SELECT * FROM boekingen 
WHERE 'now' BETWEEN tsvan AND tstot 
AND 'tomorrow' BETWEEN tsvan AND tstot

(de tijdsaanduidingen now en tomorrow zijn waarschijnlijk postgres specifiek, en alleen als voorbeeld)

Maar, wat Voutloos zegt is waar, want nu maak je onnodig veel vergelijkingen. (2 keer between, is 2 keer groter dan EN 2 keer kleiner dan, dus langzamer).
Beter groter dan en kleiner dan checken dus, de rest is irrelevant.

[ Voor 15% gewijzigd door Verwijderd op 09-02-2007 23:47 ]


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Nee, performance was mijn punt dus niet. ;)
Het gaat in 1e instante om het ophalen van correcte data, performance komt daarna wel. Between en de query welke jij nu geeft zorgt voor een ander gedrag bij (half) overlappende periodes. In de startpost stond al een query vergelijkbaar met welke jij geeft en dat was dus niet het gedrag dat TS wou.

{signature}

Pagina: 1