Moze li bez petlji, mi smo SQL programeri
Video sam negde resenje u jednom redu, ali ne mogu da ga se setim. Ima jedno drugo, koje resava mnogo slicnih problema (koji je treci cetvrtak u Oktobru sledece godine na primer, koliko ima utoraka u Decembru ove godine)
Napravis tabelu koja ima recimo dva polja. Mozes da dodas jos ako ti treba. Ovako:
CREATE TABLE Calendar
(
Datum datetime NOT NULL PRIMARY KEY -- moze i CLUSTERED, ne znam napamet kako da napisem
, Dan varchar(1) NOT NULL -- prevod na srpski dana u nedelji
, DrzavniPraznik smallint NOT NULL DEFAULT 0
)
Onda u Excelu ili necemu napravis jedno 5-10,000 dana, pocevsi od danas koje ces da umetnes u tabelu Calendar. To ti je 30 godina. Onda sledecih 30 godina samo pogledas u tabelu calendar i dobijes odgovor na svako moguce pitanje u vezi sa datumima.
Na primer, pitanje glasi "Koliko ima neradnih dana u 2008 godini (subote, nedelje i drzavni praznici)" se odgovara kverijem (svi kveriji su psudo kod, mozda negde sintaksa nije OK, ali je ideja bitna)
SELECT Datum, Dan, DrazvniPraznik
FROM CAlendar
WHERE Datum Between ('20080101' AND '20081231')
AND (Dan IN ('Subota','Nedelja') OR DrzavniPraznik=1)
Tvoj prvi petak u godini moze se dobiti ovako:
SELECT TOP 1
Datum, Dan
FROM Calendar
WHERE Datum BETWEEN ('1 Jan 2008' AND '31 Jan 2008')
AND Dan = 'Petak'
ORDER BY Datum
Bez tabele moglo bi ovako nekako: Imas zadatu godinu. Izracunas koji je dan 1. Januar te godine. ako je patak, ti si OK, ako nije znas koliko treba dana do sledecg petka. Trebac emalo CAST, CONVERT i CASE .. END da bi se izracunalo, ali tako nekao bi islo. nemam sad vremena, ako nadjem vremena pokusacu da uradim. Tabela Calendar mi je mnogo laksa, kveriji su pregledniji a i ne petljas se sa sintaksom DatePart i slicnih funkcija. I resenej radi na svim sistemima, ne samo MS SQL.