Asi se mnou nebude spousta lidí souhlasit ale úplně nejjednodušší je mít
(pokud tedy jde o aplikaci s přístupem k databázi)
mít někde tabulku datumů řekněme takovéto struktury
datum datetime (PK)
den tinyint (1-31)
tyden tinyint (0-53)
mesic tinyint (1-12)
den_v_tydnu tinyint (1-7)
svatek tinyint (1 -Ano, 0- ne)
A pokud někdo potřebuje třeba ještě dekády, kvartály apod.
Na plnění této tabulky si napsat proceduru, která to vygeneruje třeba na
10 let dopředu, Mít třeba pomocnou tabulku svátku, kterou ta procedura
či trigger vezme v potaz.
A pak to můžete do aplikace zjiˇšťovat jednoduchými selecty. V palikaci
pak nemusíte řešit jestli je den_v tydnu 1 neděle, nebo pondělí. Jediné
místo (a to opravdu jedinné), kde to budete řešit je ona plnicí
procedura(trigger)
Ta tabulka v DB moc místa nezabere, a funguuje to podle mě nejlépe.
Radek Žuja
PS: ty datové typy tinyint jsou se sybase. Je to jení nejmenší datový
typ. Jde v podstatě o Byte.
Zdravim,
kouknul jsme se do googlu a nasel jsem tam jedno reseni v .NET.
Myslim, ze bych sel touto cestou. Sice to nebude nic zariveho, ale asi
to bude jistota. Uvedu zde onen kod:
***************
CREATE function swsAdmin.fn_WorkingDays
(
@FromDate datetime,
@ToDate datetime
)
RETURNS int
with encryption
as
begin
if(@FromDate > @ToDate)
return 0
Declare @WorkingDays int
Set @WorkingDays = 0
while(@FromDate <= @ToDate)
begin
-- do not count SA & SU
if((((@@datefirst + datepart(weekday, @FromDate) - 2) %
7) + 1) < 6)
begin
Set @WorkingDays = @WorkingDays + 1
end
-- add one day
Set @FromDate = @FromDate + 1
end
return @WorkingDays
end
************
Osobne bych jeste pridelal funkci, ktera by na argument typu Date(nebo
Calendar ... dle gusta) vracela, zda je pracovni ci ne. A nekde asi
udrzovat tabulku svatku ....
Lukas Barton napsal(a):
Ladislav Starý napsal(a):
Zdravim,
nez zacnu vymyslet nejaky algoritmus, chtel bych se zeptat, jestli
se da nejakym elegantnim zpusobem zjistit pocet pracovnich dnu mezi
dvema kalendarnimi dny.
Pocet kalendarnich dnu jsem dokazal zjistit pomoci rozdilu
milisekund, ale jak to udelat s kalendarnimi dny, to me zatim nenapada.
Zatim jsem uvazoval, ze bych postupne prochazel vsechny kalendarni
dny v tom intervalu a testoval, jestli je pracovni nebo ne.
Prijde mi ale hodne pomaly. Navic jeste budu muset resit statni svatky.
Zjistit pocet pondeli-patku jde jeste vzoreckem.
A pak musite mit nekde databazi svatbku a odecist, to co lezi mezi.
Protoze pocet svatku se meni v case (napr. velikonoce, pridavaji se
svatky nove, ....).
Lukas