Toon enkel de orders van het jaar 2013 in recordset ?

Status
Niet open voor verdere reacties.

yammaski

Gebruiker
Lid geworden
9 mrt 2005
Berichten
284
Hoe pas ik de sql aan zodat enkel de orders van het huidige jaar worden getoond (en niet van de vorige jaren).
Het zou iets met DATEPART(datepart,date) moeten zijn volgens w3schools, maar ik krijg het niet klaar.


[SQL]SELECT tblOrders.OrderID, tblOrders.OrderUserID, tblOrders.OrderDate, tblOrders.OrderTotal, tblOrders.Afgehandeld
FROM tblOrders
WHERE (((tblOrders.OrderDate)=2013) AND ((tblOrders.Afgehandeld)="Ja"));[/SQL]
 
Laatst bewerkt:
Dat moet lukken zo :)
 
Dit soort dingen kun je *veel* beter oplossen door gewoon te werken met wat je hebt: datums.

De database weet niet wat de uitkomst van een extract functie op een veld zal gaan zijn dus je verplicht de database om ze *allemaal* op te halen en te berekenen en daar alles wat niet uitkomt op 2013 weer uit over te slaan.

Je kunt dus beter aangeven welke datums je precies zoekt: WHERE datumveld >= 1-1-2013 AND datumveld <1-1-2014. Dan kan de database gewoon een index gebruiken en hoeft geen enkel record te lezen om te bepalen welke hij nodig heeft.
 
Hier de aangepaste code zoals het nu werkt.

[SQL]SELECT tblOrders.OrderID, tblOrders.OrderUserID, tblOrders.OrderDate, tblOrders.OrderTotal, tblOrders.Afgehandeld
FROM tblOrders
WHERE (((tblOrders.Afgehandeld)="sent") AND ((Year([OrderDate]))=Year(Now())));[/SQL]
 
Dit werkt maar het is het meest inefficiente wat je kunt doen. Met een beetje geluk wordt YEAR(NOW)()) nog weggeoptimaliseerd naar YEAR(CURRENT_TIMESTAMP) en dat weer naar de constante "2013", maar YEAR(datum) blijft een performancedrama.

Dit is leuk en aardig op een dataset van een paarhonderd records en in toepassingen waar het niet uitmaakt dat de query er een paar seconden langer over doet, maar leer dit niet aan als "zo moet het".
 
Ik heb het aangepast zoals je voorstelt, maar ik krijg een syntaxisfout voor "WHERE".

[SQL]SELECT tblOrders.OrderID, tblOrders.OrderUserID, tblOrders.OrderDate, tblOrders.OrderTotal, tblOrders.Afgehandeld
FROM tblOrders
WHERE (((tblOrders.Afgehandeld)="sent") AND (tblOrders.OrderDate >= 1-1-2013) AND (tblOrders.OrderDate <1-1-2014);[/SQL]
 
Datums moet je als strings doorgeven, en het standaardformaat is yyyy-mm-dd. De haakjes zijn hier ook niet echt nodig want je hebt alleen AND statements dus "meneer van dale"is niet van toepassing.

Het wordt dus:

WHERE tblOrders.Afgehandeld="sent" AND tblOrders.OrderDate >= '2013-01-01' AND tblOrders.OrderDate < '2014-01-01';
 
Ik kreeg dan weer de melding dat de gegevenstypes niet overeenkomen.
Hieronder de juiste regel.

[SQL]WHERE (((tblOrders.OrderDate)>=#1/1/2013# And (tblOrders.OrderDate)<#1/1/2014#) AND ((tblOrders.Afgehandeld)="fail"));[/SQL]
 
In access, bij ontwerpweergave. Dat wordt in de SQL weergave dan automatisch omgezet.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan