Discussione:
calcolo giorni lavorativi
(troppo vecchio per rispondere)
davide
2005-11-16 11:50:39 UTC
Permalink
salve,
Mi occorre calcolare da una data memorizzata in un record la
datacalcolata=datarecord - 24 giorni(feriali)- eventuali giorni festivi
cioè mi serve una data corrispondente a -24 gg lavorativi rispetto una
certa data.

Esiste un modo? una formula?
Grazie 1000
Davide
Marcello
2005-11-16 11:59:36 UTC
Permalink
Post by davide
salve,
Mi occorre calcolare da una data memorizzata in un record la
datacalcolata=datarecord - 24 giorni(feriali)- eventuali giorni festivi
cioè mi serve una data corrispondente a -24 gg lavorativi rispetto una
certa data.
Problema carino...
Puoi dare una definizione di festivo più rigorosa su cui lavorare?
Sabato+Domenica+Festività nazionali italiane? Altro?
Post by davide
Esiste un modo? una formula?
La troviamo! :-D
Post by davide
Grazie 1000
Davide
marc.
davide
2005-11-16 13:21:27 UTC
Permalink
Post by Marcello
Post by davide
salve,
Mi occorre calcolare da una data memorizzata in un record la
datacalcolata=datarecord - 24 giorni(feriali)- eventuali giorni festivi
cioè mi serve una data corrispondente a -24 gg lavorativi rispetto una
certa data.
Problema carino...
Puoi dare una definizione di festivo più rigorosa su cui lavorare?
Sabato+Domenica+Festività nazionali italiane? Altro?
Post by davide
Esiste un modo? una formula?
La troviamo! :-D
Post by davide
Grazie 1000
Davide
marc.
Le festività italiane+ sabato e domenica ; al massimo una tabella dove
posso impostare se un tale giorno è festivo o no (es. il periodo di
chiusura aziendale,..) null'altro.
Grazie
Paolo Fiore
2005-11-16 13:35:42 UTC
Permalink
Post by davide
Le festività italiane+ sabato e domenica
sqlserver identifica il giorno della settimana e quindi copri sabato e
domenica.
per le festività... anch'io penso tabella, oppure hard-coded.
davide
2005-11-16 13:42:22 UTC
Permalink
Post by Paolo Fiore
Post by davide
Le festività italiane+ sabato e domenica
sqlserver identifica il giorno della settimana e quindi copri sabato e
domenica.
per le festività... anch'io penso tabella, oppure hard-coded.
e come?
Marcello
2005-11-16 14:09:00 UTC
Permalink
Post by davide
e come?
potresti costruirti una funzione ad hoc,
oseerva questo esempio [da completare]:

use tempdb
go
create function f_DateAddFeriali(@Data datetime, @Giorni int)
returns datetime
as
begin
-- pulizia della data
set @Data=convert(datetime,convert(varchar,@Data,112))

while @Giorni!=0
begin
set @Data=@Data+sign(@Giorni)
--sabato e domenica
if datepart(dw,@Data) in (6,7)
continue
--feste nazionali
if dateadd(yy,2000-year(@Data),@Data)
in('20000101','20000501','20000425','20001225')
continue
/*
-- chiusura azienda
if @data between @DataInizioFerie and @DataFineFerie
continue
-- calcolo della pasqua
if @data...
*/
set @Giorni=@Giorni-sign(@Giorni)
end
return @Data
end
go
select dbo.f_DateAddFeriali('20050101',12)
select dbo.f_DateAddFeriali('20050101',-12)
go
drop function f_DateAddFeriali


marc.
davide
2005-11-16 14:21:40 UTC
Permalink
Post by Marcello
Post by davide
e come?
potresti costruirti una funzione ad hoc,
use tempdb
go
returns datetime
as
begin
-- pulizia della data
begin
--sabato e domenica
continue
--feste nazionali
in('20000101','20000501','20000425','20001225')
continue
/*
-- chiusura azienda
continue
-- calcolo della pasqua
*/
end
end
go
select dbo.f_DateAddFeriali('20050101',12)
select dbo.f_DateAddFeriali('20050101',-12)
go
drop function f_DateAddFeriali
marc.
beh! mi sembra che devo contemplare i giorni nel codice: in ogni momento
potrei definire un giorno come festivo.... e non mi piacerebbe andare ad
aggiungere condizioni .
In verità l'ambiente operativo è access mentre opero mediante odbc
(tabelle collegate in sqlserver.
Devo realizzare una msk che mi calcoli -24gg rispetto ad una data....
credo che tale soluzione per la mia necessità non sia appropriata.
Lorenzo Benaglia
2005-11-16 14:47:00 UTC
Permalink
Post by davide
Devo realizzare una msk che mi calcoli -24gg rispetto ad una data....
credo che tale soluzione per la mia necessità non sia appropriata.
Ciao Davide,

prova a leggere il seguente articolo di Itzik Ben-Gan:

"No Table? No Problem"
http://www.windowsitpro.com/Article/ArticleID/27051/27051.html

Tra le soluzioni proposte troverai anche quella del nostro Luca Bianchi ;-)

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Marcello
2005-11-16 15:12:06 UTC
Permalink
Post by Lorenzo Benaglia
"No Table? No Problem"
http://www.windowsitpro.com/Article/ArticleID/27051/27051.html
Molto interessante l'artico di Itzik Ben-Gan, la richiesta di davide è
però più insidiosa, non basta sapere quanti sabati e domeniche esistono
tra due date ma bisogna stimare una dateadd che non consideri i festivi
dove con "festivi" si intendono anche le festività nazionali e i periodi
di chiusura dell'azienda.
Posto una soluzione basata su una tabella d'appoggio che trovo
soddisfaciente e che è decisamente più performante della precedente
soluzione che ho proposto:

use tempdb
go
create table t_Festività(Data datetime not null primary key,
Anno as year(Data),Mese as month(Data),Giorno as Day(Data),
constraint vu unique (Anno,Mese,Giorno))
go
insert into t_Festività values('20050425')
insert into t_Festività values('20050501')
insert into t_Festività values('20050602')
go
create function f_DateAddFeriali(@Data datetime,@Days int)
returns datetime
as
begin
Declare @d Datetime,@c int
select @d=case when @Days>0 then @Data+@Days else @Data end,
@Data=case when @Days>0 then @Data else @Data-@Days end
select @c=count(*) from t_Festività
where Data between @Data+1 and @d
if @c=0 return @d
return dbo.f_DateAddFeriali(@d,@c)
end
go
select dbo.f_DateAddFeriali('20050420',11)
select dbo.f_DateAddFeriali('20050503',-11)
go
drop function f_DateAddFeriali
drop table t_Festività

P.S.
Il problema è veramente molto affascinante.. peccato non averci pensato
per un "divertimento con..."

:-D marc.

Paolo Fiore
2005-11-16 12:01:18 UTC
Permalink
Post by davide
salve,
Mi occorre calcolare da una data memorizzata in un record la
datacalcolata=datarecord - 24 giorni(feriali)- eventuali giorni festivi
cioè mi serve una data corrispondente a -24 gg lavorativi rispetto una
certa data.
DATEDIFF
se ho capito
Loading...