Bravo za Bojana!
Sve je lako kad uocis caku

Evo resenje za MS SQL, za Ponedeljak:
Code:
;WITH Pon AS
(
SELECT
DatumIsplate
, IznosIsplate
, Dateadd(d, (2-DatePart(dw, DatumIsplate)),DatumIsplate ) AS Ponedeljak
FROM #Isplata
)
SELECT
Ponedeljak
, COUNT(*) AS KolikoIsplata
, SUM(IznosIsplate) AS UkupanIZnos
FROM Pon
GROUP BY Ponedeljak
GO
Isti princip, za Petak:
Code:
;WITH Pet AS
(
SELECT
DatumIsplate
, IznosIsplate
, Dateadd(d, (-7 + 6-DatePart(dw, DatumIsplate)),DatumIsplate ) AS Petak
FROM #Isplata
)
SELECT
Petak
, COUNT(*) AS KolikoIsplata
, SUM(IznosIsplate) AS UkupanIZnos
FROM Pet
GROUP BY Petak
Kljuc je dakako u WITH delu, kao i kod Bojana. Problem moze da se definise i ovako: Za bilo koji dan, prikazati datum za Ponedeljek u istoj sedmici.
Ako posmatrate 7 dana u nekoj sedmici (nije vazno koji dan pocinje sedmicu, nedelja, ponedeljak ili nesto drugo),onda se danima dodeljuju neki redni brojevi. Redni brojevi zavise od vaseg sistema, i obicno je Nedelja = 0, Ponedeljak = 1 itd. Na mom sistemu je je za ponedelja doeljen broj 2. Otuda 2 u izrazu pod DateDiff
Code:
SELECT
DatumIsplate
, IznosIsplate
, Dateadd(d, (2-DatePart(dw, DatumIsplate)),DatumIsplate ) AS Ponedeljak
FROM #Isplata
Za bolje razumevanje evo ovakav kveri (trebace vam tabela koju sam definisoa na pocetku) u MS SQL. Za ostale sisteme nadam se da cete shvatiti ideju pa mzoete da napisete svoj kod:
Code:
SELECT
DatumIsplate
, DatePart(dw, DatumIsplate) AS RedniBrojDAna
, ImeDana = CASE
WHEN DatePart(dw, DatumIsplate) = 1 THEN 'Nedelja'
WHEN DatePart(dw, DatumIsplate) = 2 THEN 'Ponedeljak'
WHEN DatePart(dw, DatumIsplate) = 3 THEN 'Utorak'
WHEN DatePart(dw, DatumIsplate) = 4 THEN 'Sreda'
WHEN DatePart(dw, DatumIsplate) = 5 THEN 'Cetvrtak'
WHEN DatePart(dw, DatumIsplate) = 6 THEN 'Petak'
WHEN DatePart(dw, DatumIsplate) = 7 THEN 'Subota'
END
FROM #Isplata
WHERE DatumIsplate Between '2008-10-05 00:00:00.000' AND '2008-10-11 00:00:00.000'
DatumIsplate (yy-mm-dd) RedniBrojDAna ImeDana
----------------------- ------------- ----------
2008-10-05 00:00:00.000 1 Nedelja
2008-10-06 00:00:00.000 2 Ponedeljak
2008-10-07 00:00:00.000 3 Utorak
2008-10-08 00:00:00.000 4 Sreda
2008-10-09 00:00:00.000 5 Cetvrtak
2008-10-10 00:00:00.000 6 Petak
2008-10-11 00:00:00.000 7 Subota
(7 row(s) affected)
Pitanje je sada, kako iskoristiti RedniBrojDana? Sta treba dodati ili oduzeti da se uvek dobije trazeni ponedeljak, 2008-10-06 00:00:00.000?
Bice lakse ako budemo trazili recimo sredu 2008-10-08 . Dajkle, sta treba dodati ili oduzeti od svakog datuma na lsiti da bi dobili 2008-10-08?
Ocigledno je sledece:
Za nedelju, 2008-10-05 treba dodati 3 dana da bi se dobila sreda 2008-10-08
za ponedeljak, 2008-10-06 treba dodati 2 dana
za utorak, 2008-10-07 treba dodati 1 dan
za sredu, 2008-10-08 treba dodati 0 dana
za cetvratk 2008-10-09 treba oduzeti 1 dan, dodati -1
za petak 2008-10-10 treba oduzeti 2 dana = dodati -2
za subotu 2008-10-11
Uz malo probanja dolazimo do formule za racunanje broja dana koje treba dodati:
dodatak = RedniBrojDanaZatrazenidatum - RedniBrojdana(DatumIsplate)
Ako trazimo Sredu onda je RedniBrojDana = 4 a RedniBrojdana(DatumIsplate) racunamo pomocu DatePart(dw, DatumIsplate). Sve u svemu:
Evo kveri koji korak po korak objasnjava opisani postupak:
Code:
-- Query A
SELECT
DatumIsplate
, DatePart(dw, DatumIsplate) AS RedniBrojDAna
, ImeDana = CASE
WHEN DatePart(dw, DatumIsplate) = 1 THEN 'Nedelja'
WHEN DatePart(dw, DatumIsplate) = 2 THEN 'Ponedeljak'
WHEN DatePart(dw, DatumIsplate) = 3 THEN 'Utorak'
WHEN DatePart(dw, DatumIsplate) = 4 THEN 'Sreda'
WHEN DatePart(dw, DatumIsplate) = 5 THEN 'Cetvrtak'
WHEN DatePart(dw, DatumIsplate) = 6 THEN 'Petak'
WHEN DatePart(dw, DatumIsplate) = 7 THEN 'Subota'
END
, RedniBrojZaZadatiDatum = 4
, RacunanjeDodataka = '4 - ' + '(' + CAST(DatePart(dw, DatumIsplate) AS varchar(1)) + ')'
, Dodatak = 4 - DatePart(dw, DatumIsplate)
, Sreda = Dateadd(d, (2-DatePart(dw, DatumIsplate)),DatumIsplate )
FROM #Isplata
WHERE DatumIsplate Between '2008-10-05 00:00:00.000' AND '2008-10-11 00:00:00.000'
sto daje rezultat:
Code:
DatumIsplate RedniBrojDAna ImeDana RedniBrojZaZadatiDatum RacunanjeDodataka Dodatak Sreda
----------------------- ------------- ---------- ---------------------- ----------------- ----------- -----------------------
2008-10-05 00:00:00.000 1 Nedelja 4 4 - (1) 3 2008-10-06 00:00:00.000
2008-10-06 00:00:00.000 2 Ponedeljak 4 4 - (2) 2 2008-10-06 00:00:00.000
2008-10-07 00:00:00.000 3 Utorak 4 4 - (3) 1 2008-10-06 00:00:00.000
2008-10-08 00:00:00.000 4 Sreda 4 4 - (4) 0 2008-10-06 00:00:00.000
2008-10-09 00:00:00.000 5 Cetvrtak 4 4 - (5) -1 2008-10-06 00:00:00.000
2008-10-10 00:00:00.000 6 Petak 4 4 - (6) -2 2008-10-06 00:00:00.000
2008-10-11 00:00:00.000 7 Subota 4 4 - (7) -3 2008-10-06 00:00:00.000
(7 row(s) affected)
Ako u poslednjoj kolni kverija 'Query A' stavite broj za ponedeljak (=2), dobijete resenje mozgalice. To je ako je zadati dan u okviru iste sedmice u kojoj se nalaze ispitivani dani. Ako je zadati datum u prethodnoj sedmici (novac za isplate mora stici u petak prethodne sedmice za isplate naredne sedmice) onda u formuli za dodavanje imate jos -7 (minus sedam). Za dve nedelje unapred bilo bi -14 sto je u stvari -2*7. Otud ono -7 u resenju za Petak. Nisam siguran da je kod Bojana u pitanju petak
Ko razume ovu mozgalicu mozi ce da resi probleme tipa 'traze se sedmicini zbirovi za neki izvestaj'. Izaberete bilo koji dan, recimo ponedeljak, da predstavlja celu sedmicu. Citaj "zbir za sedmcu koja pocinje u ponedeljak dana tog i tog'. Svaka sedmica pocinje u neki ponedeljak, pa ponedeljak moze da opise sedmicu. Moze i bilo koji drugi dan, kako vam se svidja. Samo treba nekako znati koje redne brojeve dodeljuje danima u sedmici vas sistem.
Sva je lako kad znas caku
Resenaj u drugim sistemi i dalje su dobrodosla. Ovo nije nesto sto se lako pamti i reprodukuje. Imamo gotove izraze dakle za MySQL i MS SQL 2005. Treba nam za ORACLE, POStGress i tako dalje, cisto da imamo gotov primer koji mozemo da cut/paste ako nam ikad zatreba.