Računanje poslednjeg dana u mesecu – EOMONTH funkcija

Objavljeno: 08-01-2014 | Autor: Nenad Živković | Kategorija: Funkcije, T-SQL

0

Iako je već prošlo neko vreme od kako je SQL Server 2012 stigao na tržište, verujem da se u većini radnih okruženja ili još uvek ne koristi ili se ne koriste sve njegove funkcionalnosti. Pored svih krupnijih i značajnijih novina koje je verzija 2012 donela i koje su opisivane na prezentacijama i u blogovima, često promaknu neke od manjih, a jedna od njih je uvođenje novih datetime funkcija. Među njima, kao veoma korisna, posebno se izdvaja funkcija EOMONTH() koja za zadati datum vraća poslednji dan u mesecu.

Pronalaženje poslednjeg dana u mesecu je nešto sa čime se DB developeri često sreću, a do sada smo morali da se snalazimo na razne načine. Da svi meseci imaju 30 dana bio bi manji problem, ali različiti broj dana u mesecu, kao i prestupne godine zahtevaju malo složeniju kombinatoriku. Evo dva primera:

DECLARE @danas Datetime =  GETDATE();
SELECT DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, @danas) +1, 0));
DECLARE @danas Datetime = GETDATE();
SELECT DATEADD(dd,-(DAY(DATEADD(mm,1,@danas))),DATEADD(mm,1,@danas));

U prvom primeru se pronalazi razlika u mesecima između nultog datuma i danas, a zatim se na tu razliku dodaje još jedan mesec i oduzima jedan dan, dok se u drugom – dan u mesecu oduzima od datuma koji je mesec dana u budućnosti od zadatog. Mnogi, koji još uvek ne koriste 2012, moraće i dalje da koriste slične transformacije, a nova funkcija omogućava isti rezulat mnogo lakše:

DECLARE @danas Datetime = GETDATE();
SELECT EOMONTH(@danas);

Pored osnovnog poziva sa jednim parametrom, EOMONTH() je moguće pozvati i sa drugim parametrom koji predstavlja broj meseci koje treba dodati, pa je tako lako moguće naći poslednji dan prethodnog ili narednog meseca:

DECLARE @danas VARCHAR(25) = '2014-01-08';
SELECT EOMONTH(@danas,1) AS PoslednjiDanSledecegMeseca;

U poslednjem primeru takođe je prikazano da EOMONTH() radi i implicitnu konverziju i da mu je osim DateTime parametra moguće proslediti i druge oblike koje je moguće konvertovati.

Iako je pronalaženje prvog dana u mesecu i do sada bilo nešto lakše nego pronalaženje poslednjeg, ostaje pitanje zašto nas Microsoft nije počastio i sa ekvivalentnom (BOMONTH?) funkcijom, no i taj zadatak je uz pomoć onoga što smo dobili svakako mnogo lakši:

DECLARE @danas Datetime = GETDATE();
SELECT DATEADD(DD,1,EOMONTH(@danas,-1)) AS PrviDanMeseca;

U našoj sekciji Korisni Skriptovi možete da preuzmete skript u kome se nalaze primeri nalaženja prvog i poslednjeg dana u mesecu za različite verzije SQL Servera.