|
[ DART_VEJDER @ 25.04.2006. 20:43 ] @
| moze li mi pomoci oko ovog SQL upita:
imam jedan datum upisan u bazu kada sam nesto nekome pozajmio i datum kada mi je to taj neko vratio.
meni treba upit koji ce mi izbaciti broj dana koliko je to bilo kod toga nekoga, ali NE RACUNAJUCI NEDJELJE!!
primjer: ako je neko nesto uzeo u subotu,15.03.2005 a vratio to u ponedjeljak,17.03.2005. onda je to bilo kod njega 1 dan,tj. kao da je vratio sutradan...!znaci ne racunamo nedjelje....
moze li ko pomoci oko ovoga?? |
[ jablan @ 26.04.2006. 08:20 ] @
Nađeš razliku u danima. Podeliš celobrojno sa 7. Na količnik dodaš jedan ako je u prethodnih m dana (a m je ostatak pri deljenju) bila nedelja i taj broj oduzmeš od razlike iz prve rečenice.
[ DART_VEJDER @ 26.04.2006. 09:33 ] @
Citat: Na količnik dodaš jedan ako je u prethodnih m dana (a m je ostatak pri deljenju) bila nedelja
a kako cu znati da li je bila nedjelja....
znaci ja ipak trebam racunati da li je bila ili nije...??
sta ako je "m" 2000?? onda da racunam koliko ima nedjelja u ih 2000 dana...??
hvala ti na pomoci, ali mi treba konkretan upit koji ce sam sve to izracunati...
[ jablan @ 26.04.2006. 09:37 ] @
Citat: DART_VEJDER: sta ako je "m" 2000?? onda da racunam koliko ima nedjelja u ih 2000 dana...??
Ne znam gde si učio matematiku, ali ostatak pri deljenju sa 7 teško može da bude 2000.
Inače, u MSSQLu redni broj dana u nedelji za zadati datum d dobijaš pomoću DATEPART(dw, d).
[Ovu poruku je menjao jablan dana 26.04.2006. u 10:41 GMT+1]
[ Ana Komazec @ 26.04.2006. 13:51 ] @
Ne znam koja je baza u pitanju, ali mozda ovaj upit pomogne:
Code: Select Veci_dat-Manji_dat + Datediff("ww", Veci_dat,Manji_dat)
From Tabela
Ovo radi u Access-u
Pozdrav
[ DART_VEJDER @ 26.04.2006. 21:51 ] @
Citat: Ne znam gde si učio matematiku, ali ostatak pri deljenju sa 7 teško može da bude 2000.
haha... :-)
lapsus, nisam najbolje procitao sta si rekao....
u pravu si, trebao bih razmisliti o onom tvom predlogu, ali zasto sam trazio upit:
da bih mogao povezati jos jednu tabelu u upit i kao uslov staviti da se takodje ne racuna onaj datum iz ovog intervala koji se poklapa sa bilo kojim iz ove dodate tabele....
uglavnom, upit bi mi malo vise pomogao, ali i ovo je dobro, pogledacu da to nekako povezem...
hvala....
@AnaKomazec:
pogledacu i ovo sto si ti napisala....
mozes li samo objasniti sta znaci ovo "Datediff("ww", Veci_dat,Manji_dat)" ??
ovu f-ju prvi put vidim...
da, access je u pitanju...
hvala i tebi na odgovoru...
[ Ana Komazec @ 27.04.2006. 14:27 ] @
Ta funkcija broji koliko ima Nedelja (Sundays) izmedju 2 datuma. U ovom slucaju dobija se negativan broj, zato i stoji "+" ispred. Minus bi stajao kada bi oblik bio Datediff("ww", Manji_dat,Veci_dat).
Napomena: Manji_dat i Veci_dat su imena atributa, u smislu Uzeo i Vratio tipa Date, ne konkretni datumi
Pozdrav
[Ovu poruku je menjao Ana Komazec dana 27.04.2006. u 15:31 GMT+1]
[ branimir.ts @ 04.05.2006. 16:06 ] @
Za MSSQL
Code:
DECLARE @dateFrom datetime
DECLARE @dateTo datetime
DECLARE @DaysBetween int
SET @DaysBetween = 0
SET @dateFrom = '20060429'
SET @dateTo = '20060508'
WHILE @dateTo - 1 >= @dateFrom
BEGIN
SET @dateFrom = @dateFrom + 1
IF DATEPART(dw,@dateFrom) <> 1 --Nedelja
SET @DaysBetween = @DaysBetween + 1
END
SELECT @DaysBetween as BrojDana
Rezultat:
Code:
----------
BrojDana
----------
7
----------
Ovo mozes da dalje "trpas" u stor proc , funkciju ili kako vec....
Pozdrav
[ chachka @ 09.05.2006. 00:14 ] @
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.
[ jablan @ 09.05.2006. 08:28 ] @
Wow, kakva zloupotreba baze...
[ branimir.ts @ 09.05.2006. 08:41 ] @
Kao prvo, zeleo bih da komentarisem samu sustinu gore navedenog problema.
U praksi su mi se vise puta pojavljivali - za razlicite RDBMS - ovakvi , slicni ili manje slicni "problemi".
Ono sto sam uspeo da zakljucim je da se ovakve stvari resavaju najcesce klasicnim "programerskim" putem, bez upotrebe SQL a ( ne kazem da SQL treba izbegavati po svaku cenu, sto se vidi iz mog ranije navedenog resenja).
Ali, kolega -alias DART_VEJDER je naglasio da ima postojecu bazu MS access , dakle kod njega bi bila dovoljna jedna VBA funkcija koja bi primala samo dva parametra - dateFrom i dateTo, bez ikakvog SQL -a . Ako bi moje gore navedeno resenje za MSSQL implemetirali u MS Access , odn u spomenutu VBA funkciju, to bi moglo da bude nesto poput sledeceg :
Code:
Public Function BrojDana (dateF As Date, dateT As Date) As Integer
Dim DaysBetween As Integer
While dateT - 1 >= dateF
dateF = dateF + 1
If DatePart("w", dateF) <> 1 Then
DaysBetween = DaysBetween + 1
End If
Wend
BrojDana = DaysBetween
End Function
Sto se tice tvog "skalabilnog resenja" ono ima samo jednu prednost. Zaista je portabilno.
Nazalost, sve ostalo su mane. Pocev od neprestanog dopunjavanja baze sa datumima i danima, uvodjenje novih tabela u postojece resenje, komplikacija sa excellom, pa cemu sve to brate mili ???
Pozdrav
[ Zidar @ 09.05.2006. 15:28 ] @
Chachka je potpuno u pravu. Resnje koje on nudi je u duhu SQL standarda - potpuno deklarativno, nasuprot proceduralnim resenjima koja zahtevaju pisanje proceduralnog koda. Zasto je problem napuniti tabelu subotama i nedeljama? Covek lep kaze, uradis to u Excelu i importujes u bazu. Nista vas ne sprecava da unesete sledecih deset hiljada nedelja.
Njegovo resenje ima jos jednu prednost. Mozete da unesete i bio koji drugi datum, ne samo subote i nedelje. Drzavni i verski praznici, neredni dani po bilo kojoj osnovi idu bez problema u njegovu tabelu. razlog sto je neko na pocetku trazio brojanje nedelja i subota jeste sto mu za neke proracune treba broj radnih dana izmedju dva datuma. Broj subota i nedelja nije kompletno niti tacno resenje. Postoje i drugi neradni dani, ne samo subote i nedelje. Zatim, ko kaze da se u buducnosti nece uvesti cetvorodnevna radna nedelja, gde se i peatk biti neradan. Sta cemo onda, da prepravimo funkcije? A moze se desiti da se subota proglasi radnim danom, pa i nedelja. Sve zavsi od situacije i bisnis problema koji resavamo. Pravo pitanje glasi 'kako naci sve neradne dane izmedju dva datuma' a ne 'kako napisati najefikasniju funkciju za pronalazenej broja nedelja izmedju dav datuma'.
Ovo sa praznicima nisam ja izmislio ili smislio sam, taman posla. Sve ima lepo objasnjeno u knjigama iz serije "Developers Handbook", napisao Ken Getz i drugari Paul Litwin, Greg Reddick i Mike Gilbert.
Posto je originalno pitanje bilo za Access, evo jednog Access resenja, koje doduse nije deklarativno, proceduralno je i ima dve funkcije:
http://www.mvps.org/access/datetime/date0006.htm
:-)
[ branimir.ts @ 09.05.2006. 16:02 ] @
Uf, cini mi se da sam jednom kritikovao jednog kolegu sa foruma zbog nacina razmisljanja slicnog tvom-doduse u poslednje vreme primecujem da je dosta naucio i zaista mi je drago zbog toga :)
Vidi ovako, cela ova tvoja prica me podseca na onu -zasto stvar uraditi iz jednog koraka kada moze i iz 100 ?
Zasto resiti problem sa tri varijable kada se moze kreirati tabela, insertovati 100 000 slogova, obelezavati posebno neradni i radni dani, importovati excel tabela u jos jednu osim postojecih, implementirati upite u SQL bazu podataka....
Izvini sto moram ovako da te pitam, ali jesi li ti normalan?
Moram se sloziti sa tobom da , je, najverovatnije, tvoje izlaganje (teorijski) tacno .
Ali, ipak i nakon svega sto si napisao, ostaje cinjenica da je za ovo tvoje "deklarativno" resenje potrebno izdvojiti neizmerno vise vremena u odnosu na "proceduralno" od koga ti toliko, cini mi se, bezis.
Naravno da je za svakog onog koji ima dovoljno vremena ( na pretek) - cak i onog koji ce raditi samo cetiri dana u nedelji (teorijski) i koji ima neogranicene resurse sto se tice hardvera, onakvo resenje zadovoljavajuce.
Iskreno, svako od nas se moze igrati bazama (koje ne sluze nicemu) do mile volje . Ali u ogromnim produkcionim sistemima vreme i resursi su stvari od neprocenjivog znacaja.
Zato treba teziti da se do resenja dodje na sto efikasniji nacin, a teoriju ostaviti za neko drugo, "slobodno" vreme.
Pozdrav
[ goranvuc @ 09.05.2006. 17:31 ] @
Stvarno ne znam sto se raspravljate kada je resenje trivijalno.
Ako imas polja DatumUzimanja i DatumVracanja u tabeli Promet onda bi upit koji vraca kolonu koja predstavlja broj dana koliko je neko drzao nesto ne racunajuci nedelje:
Code:
SELECT DateDiff("d", DatumUzimanja, DatumVracanja) - (DateDiff("d", DatumUzimanja, DatumVracanja) \ 7) - IIf(Weekday(DatumUzimanja) > Weekday(DatumVracanja), 1, 0) AS Drzao
FROM Promet
Probaj!
[ chachka @ 09.05.2006. 17:42 ] @
DART_VEJDER je trazio SQL UPIT! Nije spominjao Access, M$SQL, VBA, Delphi, Javu, ...
Najblizi odgovor mu je dala Ana Komazec. U njenom resenju se pojavio upit, ali njen upit radi samo u M$ svetu.
Kako god resavali originalni probleme pa i ostale probleme s datumima (papir i olovka, abakus, kompjuter), u glavi imamo mentalnu sliku Julijanskog kalendara. Ta mentalna slika je pretocena u tabelu i data bazi, tako da i baza moze da je koristi u resavanju originalnog problema.
Zidar je napisao ono sto je mene mrzelo da pisem.
Za kraj evo pitanja i od mene:
Koliko je bilo neradnih dana za katolike u Srbiji u Aprilu 2006 (Subota i Nedelja su tipicno neradni dani.)?
Ako ima zainteresovanih ja cu odgovoriti SQL-om.
Chachka
[ chachka @ 09.05.2006. 17:46 ] @
Gorane to ne radi pod PostgreSQL-om, a ni pod FireBird-om! Mrzi me da instaliram Oracle i DB2 ali mislim da ne radi ni u njima.
Chachka iz Choke
[ goranvuc @ 09.05.2006. 17:58 ] @
Pozdrav Chachki! Al' je svet mali!
Decko je trazio resenje za Access, slicno je i za MS SQL Server, a verovatno bi moglo da se prebaci na bilo sta od toga sto si naveo - bitno je sta radi navedeni izraz (mislio sam da se ovde pomaze ljudima kod konkretnih problema, a ne da se vodi filozofska rasprava i iznose resenja koja bi trebala da rade u bilo kom DBMS-u). Nisam hteo nikog da omalovazavam time sto sam rekao da je resenje trivijalno, a ne bih ni seo da napisem odgovor da niste suvise otisli u sirinu.
[ jablan @ 10.05.2006. 08:12 ] @
Citat: chachka: u glavi imamo mentalnu sliku Julijanskog kalendara.
Ne znam za tebe, ali ja i svi ljudi koje znam (ne poznajem nijednog pravoslavnog popa doduše) koristimo Gregorijanski kalendar.
Trpati datume u tabelu ima logike samo ako se u tabelu stavljaju neradni dani, i to ne subote i nedelje, već samo praznici. Inače glavu dajem da svi, ali svi savremeni sistemi imaju funkcije ako ni za šta drugo ono za određivanje je li neki dan subota ili nedelja. Drugim rečima: u svakom, ali svakom sistemu može se napisati upit sličan onom koji je naveo goranvuc.
[ Zidar @ 10.05.2006. 14:32 ] @
Slazem se sa Jablanom u svemu: Citat: Trpati datume u tabelu ima logike samo ako se u tabelu stavljaju neradni dani, i to ne subote i nedelje, već samo praznici. Inače glavu dajem da svi, ali svi savremeni sistemi imaju funkcije ako ni za šta drugo ono za određivanje je li neki dan subota ili nedelja. Drugim rečima: u svakom, ali svakom sistemu može se napisati upit sličan onom koji je naveo goranvuc.
Posto se nedelje mogu odrediti kverijem, ne vidim razlog da se uopste pise ikakva funkcija za taj deo problema. Prema tome, nisam ja taj koji hoce da uradi nesto u 1000 koraka :-)
Posto su ovo diskusije, a ne odgovaranje na strogo uska pitanja, napomenuo sam da se mozda radi o problemu 'broj neradnih dana izmedju dva datuma', sto je malo opstije pitanje nego 'broj subota i nedelja izmedju dva datuma', pa je mozda vredno razmatranja. Za subote i nedelje dakle imamo kveri, a za praznike upotrebimo tabelu i sve je reseno. Bas kao sto rece Jablan u prvoj recenici citiranog teksta. Kombinovanje kverija koji racuna broj subota i nedelja izmedju dva datuma sa tabelom sa praznicima moze da bude komplikovan posao, pa stoga trpanje u tabelu svih subota i nedelja uz datume i nije tako glupo resenja kao sto se na prvi pogled moze uciniti.
Ko voli da pise funkcije, eto mu zabave - napisati funkciju koja za sledecih 100 godina ubacuje u tabelu sve subote i nedelje. koliko ce da bude velika ta tabela? Pa, otprilike 52 sedmice * 2 * 100 godina = 10,400 slogova, plus recimo 10 dana praznika godianje i eto nas na skoro 11,000 slogova. mnogo? I do't think so :-) Kad jednom napravite ovu tabelu, mozete je seliti iz baze u bazu. Na duzi rok gledano, stedi vreme.
[ chachka @ 10.05.2006. 14:46 ] @
Citat: jablan: Ne znam za tebe, ali ja i svi ljudi koje znam (ne poznajem nijednog pravoslavnog popa doduše) koristimo Gregorijanski kalendar.
Priznajem, moja greska :)
Ponovicu: Ja sam odgovorio na pitanje o UPITU koji resava problem. Pitanje je postavljeno u forumu o bazama podataka. Nisam odgovorio na pitanje postavljeno u Access forumu pod temom broj dana minus nedjelje (Borland i baza). Nisam odgovorio na pitanje 'Koliko je dugacak najkraci exe fajl koji racuna razliku izmedju dva dana bez Nedelja, a da usput rezultat izbaci na LPT port?'
Inace, ako me neko pita: "Na koji datum pada pravoslavni Uskrs 2007. godine?", mogu da dam vise odgovora.
1. Pogledaj u crkvenom kalendaru Srpske Pravoslavne Crkve.
(Odgovor je tacan, ali je beskoristan ako ta osoba nema spomenuti kalendar.)
2. Evo ti jednacine pa izracunaj, a resenje je po Julijanskom kalendaru:
G = Godina MOD 19
I = (19*G + 15) MOD 30
J = (Godina + Godina DIV 4 + I) MOD 7
L = I - J
Mesec = 3 + (L + 40) DIV 44
Dan = L + 28 - 31* (Mesec DIV 4)
(Odgovor je opet tacan, ali je beskoristan za osobu koja nezna sta su DIV i MOD (npr. moja baba))
3. 8.4.2007. po Gregorijanskom ili 26.3.2007. po Julijanskom kalendaru.
(Odgovor je valjda tacan, koristan, ali osoba nece znati da se snadje 2008. godine.)
Lista odgovora nije potpuna... Koji cu odgovor odabrati zavisi od mog raspolozenja, od osobe koja je postavila pitanje, od cilja koji hocu da postignem odgovaranjem na pitanje, ....
Chachka
[ branimir.ts @ 10.05.2006. 16:24 ] @
Citat: ....i eto nas na skoro 11,000 slogova. mnogo? I do't think so
Moram ti priznati da je za mene, jos uvek, i 11 000 bitova mnogo  .
Posto vidim da se ovde govori o mentalnim sklopovima, crkvenim kalendarima, IT osposobljenosti necijih baba etc, zeleo bih da zakljucim ovu temu sledecim : izbor resenja moze zavisiti od programerske navike i nacina razmisljanja (tako razlikujemo lose, osrednje, dobre i kvalitetne programere ), opste situacije na "terenu" , kao i vremena koje imamo na raspolaganju.
Moram se takodje sloziti sa kolegom zidarom koji tvrdi da je chackovo "uprosceno" resenje jako dobra stvar kada su u pitanju projekti gde zaista postoji potreba za ucestalim "ocitavanjem" realnog broja radnih dana.
Ali pitanje je ipak bilo "daj mi broj dana izmedju dva datuma, ne racunajuci nedelje". Ja sam samo dao moguce (proceduralno) resenje. I ono radi, sto je najvaznije .
Pozdrav
[ goranvuc @ 10.05.2006. 16:59 ] @
Posto se ovde otislo u offtopic i sada je pitanje: "Kako odrediti broj radnih dana izmedju dva datuma?" ajde i ja da iznesem svoje misljenje.
Posto nijedan DBMS nije toliko pametan da zna nase praznike (to ne zna 99,99% nasih drzavljana) ocigledno je da se dotican problem mora resiti upisom neradnih dana u neku tabelu, dakle Chachka ima pravo sto istice svoje resenje. Moje resenje se neznatno razlikuje od izlozenog u smislu da ja takvu tabelu zovem "NeradniDani" (naravno, ne zovem je tako u praksi) i ona sadrzi samo neradne dane (bez nedelja), a ne sve dane iz kalendara.
Broj neradnih dana u nekom periodu se onda svodi na prethodno resenje sa nedeljama i jos se i oduzima broj dana iz tabele "NeradniDani" koji su u trazenom periodu.
Ovo iznosim samo kao alternativu i kao resenje koje je blize mom nacinu resavanja problema - vise volim duzi upit, a manji broj podataka koji se (zlo)upotrebljavaju. Pozdrav svima, a najvise onom koji je ovo zakuvao, pa sad gleda sa strane kako se mi raspravljamo i nema nameru da nam konacno kaze kako je resio problem.
[ Zidar @ 10.05.2006. 19:00 ] @
Vazno je da sva ponudjena resenja rade i da se nismo posvadjali
Kad smo vec off topic, evo sta pise o Julian date u Joe Celko's 'Data and Databases Concepts in Practice':
Citat:
9.3 The Julian Date
If you are going to use universal dates, think big and use Julian dates. The Julian date is a number set up by astronomers that currently is seven digits long. It ranges from 4713 January 01, BCE through 27,378 CE, which ought to be enough for any database application. The use of starting of 4713 January 01 BCE is related to solar and lunar cycles.
This format avoids some problems, such is finding the day of the week (take the Julian date modulo 7) and leap year conversions. Durations are calculated by simple substraction and addition. Finding the phase of the moon, lunar eclipses, solar eclipses and other astronomical facts is fairly simple algebra - which is why astronomers use it.
The downside is that existing systems, both legal and computer, would need to be rewritten.
Sto ce reci, datumi su serijalizovani pocevsi od 1. Januara 4073. g. pre nove ere pa do godine 27,378. g. nove ere. Trajanje intervala izmedju dva datuma je prosto oduzimanje, a dan u nedelji se odredjuje po modulu 7 od datog Julian datuma. Sve ovo nesto zvuci poznato
Nisam siguran da ovaj Julian date ima veze sa Julianskim kalendarom koji koristi Pravoslavna crkva, to moze neki astronom da nam kaze.
[ negyxo @ 11.05.2006. 07:48 ] @
Pa kada smo vec offtopic
Citat:
evo sta pise o Julian date u Joe Celko's 'Data and Databases Concepts in Practice':
Gde nadje Celko-a :)
Da on uleti kojim slucajem ovde na forum, ispljuvao bi sve koji se ne drze strogih principa relacionih baza podataka.
[ jablan @ 11.05.2006. 08:17 ] @
Citat: Zidar: Nisam siguran da ovaj Julian date ima veze sa Julianskim kalendarom koji koristi Pravoslavna crkva, to moze neki astronom da nam kaze.
Pa nema puno veze sa julijanskim kalendarom:
http://en.wikipedia.org/wiki/Julian_date
Štaviše, nema puno veze ni sa kakvim kalendarom, pošto ovaj način računanja vremena potpuno izbacuje mesece i godine iz upotrebe, barata se samo sa danima (otud tako lako izračunavanje dana u nedelji, razlike dva datuma itd).
Tako da je po toj računici npr. 30. april 2000. ustvari julijanski dan 2451665.
Štaviše, i vreme u toku dana se onda može predstaviti kao decimalni deo julijanskog dana tako da je npr. sad otprilike .38 julijanskog dana (po srednjeevropskom vremenu)
Prilično, pa reklo bi se, fizičarski pristup kalendaru...
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|