Rekenen met datum

Status
Niet open voor verdere reacties.

rista62

Gebruiker
Lid geworden
25 nov 2009
Berichten
73
Hallo,

Ik heb een tabel met leden en daar staat een "Uitschrijfdatum" in. Uitgangspunt is dat ik niets aan het gegevenstype kan veranderen. Ik heb een query gemaakt waarbij ik de leden wil met als Uitschrijfdatum >"01-02-2009". Dit gaat niet goed want ik het lid met Uitschrijfdatum 01-01-2010 niet. Dit heeft waarschijnlijk met het format te maken dat de datum als Tekst is opgeslagen. Hoe kan ik in mijn query dit goed krijgen. Ik wil dus niet in mijn tabel het gegevenstype veranderen. Zie bijlage
Kan iemand mij helpen?

Groet,
R.
 

Bijlagen

Oi,oi,oi.... Een datum moet je om te beginnen natuurlijk altijd als datum/tijd opslaan ;)
Gelukkig kun je dit probleem nog wel omzeilen in de query. Uitgangspunt daarbij is dat je de datum om moet zetten van Tekst naar Datum. Dat doe je (bijvoorbeeld) met CDate.

SELECT tblLedenlijst.Nummer, tblLedenlijst.Naam, tblLedenlijst.InschrDatum, CDate(nz([UitschrDatum],0)) AS UitDatum
FROM tblLedenlijst
GROUP BY tblLedenlijst.Nummer, tblLedenlijst.Naam, tblLedenlijst.InschrDatum, CDate(nz([UitschrDatum],0))
HAVING (((CDate(nz([UitschrDatum],0)))>#2/1/2009#));
 
Vermijd het gebruik van HAVING aangezien dit een negatieve impact kan hebben op performance.
Je stuurt nu een conditie mee en daarvoor heb je alleen een WHERE clause nodig

Code:
SELECT tblLedenlijst.Nummer, tblLedenlijst.Naam, tblLedenlijst.InschrDatum, CDate(nz([UitschrDatum],0)) AS UitDatum
FROM tblLedenlijst
WHERE CDate(nz([UitschrDatum],0) >#2/1/2009# ;

Tardis
 
Hallo,
Bedankt voor jullie snelle reactie. Ik ben nog maar een groentje in Access.
Als ik het goed begrijp maak je in de query een nieuw veld aan namelijk:CDate(nz([UitschrDatum],0)) AS UitDatum Dit doe je uit de tabel Ledenlijst met als criteria CDate(nz([UitschrDatum],0) >#2/1/2009#. Dit gaat bij mij niet goed want in het maken van het nieuwe veld hikt hij op de ,0 in CDate(nz([UitschrDatum],0)). Kan iemand mij dat uitleggen of voor doen? Ik werk zelf met Access 2003.
Wat betekent de "nz" in de formule CDate(nz([UitschrDatum],0)) ?
Hoe krijgen jullie dit zo leesbaar voor elkaar:
SELECT tblLedenlijst.Nummer, tblLedenlijst.Naam, tblLedenlijst.InschrDatum, CDate(nz([UitschrDatum],0)) AS UitDatum FROM tblLedenlijst
WHERE CDate(nz([UitschrDatum],0) >#2/1/2009# ;?
Ik ben erg benieuwd, alvast bedankt.
Groet,
R.
 
Als je zelf een query maakt in het query-ontwerpscherm, dan zul je zien dat je de verschillende onderdelen van de functie scheidt met een puntkomma (;). Als je de query vervolgens bekijkt in het SQL scherm, zul je zien dat de puntkomma's zijn vervangen door komma's.... Dat is dus nogal verwarrend!
De code die Tardis en ik hebben geplaatst, komt uit het SQL venster. Het voordeel van het aanleveren van code vanuit het SQL venster is, dat je de code kunt kopieëren, en zo in het SQL venster kunt plakken. De query moet het dan gelijk doen. Wil je de query zelf opbouwen, wat uiteraard ook kan, dan moet je dus, waar je een komma ziet staan, een puntkomma gebruiken.
Je komt overigens in het SQL scherm via <Beeld>, <SQL>.
Nu de vraag over de Nz functie:
Dit is een Visual Basic functie, waarmee je controleert of een veld leeg is niet. Bij een tekstveld gebruik je normaal gesproken een oproep als: IIF([Veld]="";"";[Veld] & " "). In dit voorbeeld zou je Veld bijvoorbeeld kunnen vervangen door Tussenvoegsel; het is dan een formule waarmee je een tussenvoegsel in een samengevoegd veld Voornaam+Tussenvoegsel+Achternaam kunt zetten. Je krijgt dan geen dubbele spatie als iemand geen tussenvoegsel heeft. Ga je met getallen werken (en een datum is een getal) dan werkt dat niet. Een getal kan Nul zijn (het getal 0), een waarde bevatten, of leeg zijn, in welk geval de waarde Null is. Omdat je geen vergelijking kunt maken met een veld dat de waarde Null bevat, moet je een leeg datumveld 'vertalen' naar een getal. Dat doe je dus bijvoorbeeld met de functie Nz. De formule Nz([UitschrDatum],0) beoordeelt dus het veld [UitschrDatum], en vervangt de lege waarde door het getal Nul (0). Omdat je het getal ook nog eens als een Datum wilt verwerken, wordt het getal in [UitschrDatum] ook nog eens omgezet naar datum met de functieCDate. Daarom staat die functie er voor. De volledige functie is dus: CDate(Nz([UitschrDatum],0)).

Overigens is het technisch mooier om de functie Nz niet te gebruiken, omdat het, zoals gezegd, een VB functie is. En dat maakt de query trager. Beter is dus eigenlijk deze formule:

CDate(IIF([UitschrDatum] Is Null,0;[UitschrDatum]))

Code:
SELECT tblLedenlijst.Nummer, tblLedenlijst.Naam, tblLedenlijst.InschrDatum, CDate(nz([UitschrDatum],0)) AS UitDatum
FROM tblLedenlijst
WHERE CDate(IIF([UitschrDatum] Is Null,0;[UitschrDatum])) >#2/1/2009# ;

Je krijgt de code als code in je tekst met de knop <Code> die je als # in de werkbalk ziet staan.
 
@OctaFish,

even off topic, waar kan ik deze info jouwerzijds vinden:

Overigens is het technisch mooier om de functie Nz niet te gebruiken, omdat het, zoals gezegd, een VB functie is. En dat maakt de query trager.

Kan me namelijk vergissen maar VB kent helegaar geen Nz functie.

Tardis
 
Geheel off-topic antwoord: op de website van Allen Browne staat e.e.a. verklaard. Overigens kunj je Nz in VBA echt wel gebruiken..
Ik heb het gelukkig niet zelf verzonnen ;)
 
In de link waar je naar verwijst staat niets dat je eerdere opmerkingen ondersteunt.
Je opmerkingen zijn onjuist.

Lijkt me ook dat je VB en VBA in je opmerkingen door elkaar haalt ;)

Just so u know, use it in future for better ;)

Tardis
 
Hallo,
Octafish en Tardis geweldig zoals het werkt. Octafish ook nog bedankt voor de goede uitleg, zo kom ik weer een stapje verder.
Thanks.
Gr. R.
:)
 
@Tardis:

Misschien is een cursus Engels geen verspilde moeite...

Note: JET's IIf() is much more efficient than the similarly named function in VBA. The VBA one wastes time calculating both the True and False parts, and generates errors if either part does not work out (even if that part is not needed.) The JET IIf() does not have these problems.)
 
@OctaFish,

met dat Engels zit het wel goed, heb toevallig jarenlang in het buitenland gewoond en gewerkt.

Je opmerkingen zijn en blijven absolute kolder :cool:

Tardis
 
@Tardis:

Als ik moet kiezen tussen wat een Access Guru als Allen Browne zegt, of een snotaap als jij die alleen maar roept, maar zelden iets nuttigs inbrengt, dan is die keuze niet moeilijk, vind je zelf ook niet??? Doe me een lol, en zeg alleen nog iets over mijn posts als het iets nuttigs is, daar doe je de rest van het forum ook een veel groter plezier mee. Meer woorden zal ik er verder niet aan vuil maken, zonde van mijn tijd...
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan