Cum funcționează
„Luna curentă” nu e o lună anume
Nu se poate scrie WHERE data_comanda >= '2026-09-01': interogarea ar fi corectă în septembrie 2026
și greșită în orice altă lună. „Luna curentă" înseamnă luna în care rulează interogarea, deci data
de azi trebuie citită de la sistem.
Două lucruri sunt necesare: data de azi și o funcție care scoate luna dintr-o dată.
| Sistem |
Data de azi |
Luna dintr-o dată |
| SQL standard |
CURRENT_DATE |
EXTRACT(MONTH FROM d) |
| Oracle |
SYSDATE |
EXTRACT(MONTH FROM d) sau TO_CHAR(d, 'MM') |
| Access |
Date() |
Month(d) |
| MySQL |
CURDATE() |
MONTH(d) |
| SQL Server |
GETDATE() |
MONTH(d) |
În Access, interogarea devine:
WHERE Month(data_comanda) = Month(Date()) AND Year(data_comanda) = Year(Date())
De ce condiția pe an nu e opțională
Aceasta e greșeala pe care o face aproape toată lumea:
WHERE EXTRACT(MONTH FROM data_comanda) = EXTRACT(MONTH FROM CURRENT_DATE) -- INSUFICIENT
Condiția spune „luna e septembrie", nu „luna e septembrie 2026". O comandă din septembrie 2024
trece la fel de bine. Într-un tabel cu istoric de doi-trei ani, rezultatul are de trei ori mai multe
rânduri decât trebuie — și arată perfect plauzibil, pentru că toate datele afișate sunt, într-adevăr,
din septembrie.
Varianta echivalentă, care compară direct cele două luni ca text AAAA-LL:
WHERE TO_CHAR(data_comanda, 'YYYY-MM') = TO_CHAR(SYSDATE, 'YYYY-MM') -- Oracle
O singură condiție, imposibil de uitat pe jumătate. Mai puțin explicită, dar mai greu de greșit.
b) DISTINCT, pentru același motiv ca la #133
Un restaurant cu trei comenzi în luna curentă ar apărea de trei ori. Vezi
problema #133 pentru ce face
exact DISTINCT și de ce nu funcționează pe o singură coloană din mai multe.
Greșeli frecvente
- Condiția pe an uitată — intră comenzile din aceeași lună a tuturor anilor. Cea mai
frecventă greșeală, și una care nu se vede în rezultat.
- Data scrisă de mână (
>= '2026-09-01') — răspunde corect o lună și greșit tot restul anului.
BETWEEN '2026-09-01' AND '2026-09-30' — aceeași problemă, plus capcana lunilor de 28 și 31 de
zile.
MONTH(data_comanda) în Oracle — funcția nu există acolo; e EXTRACT sau TO_CHAR.
DISTINCT uitat la b) — lista restaurantelor conține dubluri.
- Comparație între o dată și un șir, fără conversie — merge într-un sistem și dă eroare în altul.
În Oracle,
TO_DATE('2026-09-01', 'YYYY-MM-DD').