Evo ti resenje u standardnom SQL-u bez upotrebe M$SQL specificnih funkcija, stored procedure, ...
Prvo napravis tabelu kalendar.
Code:
CREATE TABLE kalendar (
kalendarski_dan DATE NOT NULL PRIMARY KEY(kalendarski_dan),
kratko_ime_dana CHAR(2) NOT NULL CHECK (ime_dana IN ('PO', 'UT', 'SR', 'CE', PE', 'SU', 'NE'))
);
Dane sam kodirao sa 'PO', 'UT, ... , 'NE' a ne sa brojevima 0, 1, ... , 6, tako da nemoram da razmisljam da li je 0 (nula) oznaka za Nedelju ili Ponedeljak.
Ova tabela uz dodatne kolone moze biti vrlo korisna za razne upite.
Popunis ovu tabelu.
Code:
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-01', 'UT');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-02', 'SR');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-03', 'CE');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-04', 'PE');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-05', 'SU');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-06', 'NE');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-07', 'PO');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-08', 'UT');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-09', 'SR');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-10', 'CE');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-11', 'PE');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-12', 'SU');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-13', 'NE');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-14', 'PO');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-15', 'UT');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-16', 'SR');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-17', 'CE');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-18', 'PE');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-19', 'SU');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-20', 'NE');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-21', 'PO');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-22', 'UT');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-23', 'SR');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-24', 'CE');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-25', 'PE');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-26', 'SU');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-27', 'NE');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-28', 'PO');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-29', 'UT');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-30', 'SR');
INSERT INTO kalendar (kalendarski_dan, kratko_ime_dana) VALUES ('2005-03-31', 'CE');
Ja sam je popunio samo sa danima iz Marta 2005. Inace se popunjava sa dovoljnim vremenskim intervalom (nekoliko godina, veoma se lako dopunjuje ako postoji potreba za vecim intervalom). Usput, u mom kalendaru je 15.3.2005. Utorak. I da se vodis po Gregorijanskom kalendaru opet ne bi bila Subota :)
Za popunjavanje tabele kalendar sam upotrebio Excel u kojem se vrlo lako prave ovakve kalendarske tabele, a onda sam iz Excela importovao u bazu.
Tvoj upit je dalje veoma lak. Prebrojis dane u kalendaru izmedju dva datuma koji nisu Nedelje. Obrati paznju kako upit prirodno prati tok recenice na srpskom (Nisu potrebne carobne M$SQL funkcije sa parametrom 'ww'. Sta dovraga znaci 'ww' u srpskom ili engleskom?).
Code:
SELECT COUNT(*) - 1
FROM kalendar
WHERE kalendarski_dan BETWEEN '2005-03-15' AND '2005-03-17'
AND NOT kratko_ime_dana = 'NE'
Napomena: Ovaj upit moze da vrati rezultat -1 u slucaju da su pocetni i krajnji dan isti i da je taj dan Nedelja. Ovo mozes da izbegnes upotrebom CASE izraza, odnosno sledecim upitom (opet standardni SQL):
Code:
SELECT CASE WHEN COUNT(*) = 0
THEN 0
ELSE COUNT(*) - 1
END
FROM kalendar
WHERE kalendarski_dan BETWEEN '2005-03-15' AND '2005-03-17'
AND NOT kratko_ime_dana = 'NE'
Resenje je provereno na PostgreSQL 8.1.
POZDRAV
PS:- CASE izraz sigurno ne prolazi u InterBase 6.x, 7.1 a prolazi na Firebird 1.5 - sto govori u prilog besplatnog Firebird-a u odnosu na komercijalni InterBase.
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming." - Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo