Datums zou je op moeten slaan volgens standaarden, yyyy-mm-dd is dan een makkelijke, omdat in dat formaat de textuele sortering de numerieke sortering volgt zodat je op een zinnige manier datums voor en na een specifieke datum of in een interval kunt oproepen.
Hoe je de datum vervolgens weergeeft (bijvoorbeeld als d-m-y) staat hier compleet los van.
Terug naar de tekentafel van je database-ontwerp dus.
Waarom gebruik je geen DATETIME?
Ik gok dat je een VARCHAR hebt, en dus heeft SQL geen enkele weet dat je een datumformaat gebruikt, en sorteert hij maar op de dag. Want na 1 komt 2, en daarna komt weer 3.
De vergelijkingen (zowel teksten alsook DATETIMEs) zijn sowieso allebei tekstueel. Daarom is het dus belangrijk dat de tijdseenheid met het grootste gewicht vooraan staat (het jaar).
De datums worden alfabetische geordend. Dus wordt er vanaf het begin van de (datum)string gekeken wat groter/kleiner is. Dit is niet hetzelfde als een numerieke vergelijking.
Vergelijk:
SELECT 312 < 41;
> 0
(312 komt numeriek niet voor 41)
SELECT '312' < '41';
> 1
('312' komt textueel (lexicografisch) wel voor '41')
Als de kolom een varchar is, is er nog steeds de mogelijkheid dat iemand er via een omweg misschien toch "vandaag" in weet te proppen.
of 99-02-MMXX
Date / datetime geeft in elk geval ook al naar de database aan waar het om gaat, zodat die er met interne opslag en extra functies al rekening mee kan houden.
Ik kan me voorstellen dat
WHERE YEAR(datumkolom) = 2020 beter werkt dan
WHERE datumkolom LIKE '2020%' of iets met substring()