TSQL: Estendere la funzione DATEADD per escludere i fine settimana (it-IT)
Introduzione
Dal momento che molti esercizi e cicli produttivi sono fermi durante il week-end, esiste molto spesso la necessità di ragionare le date di un determinato processo in termini di giorni lavorativi, escludendo pertanto il fine settimana. Per esempio, potremmo essere in una situazione in cui abbiamo necessità di calcolare l'arrivo di una data merce ordinata, da calcolarsi come numero di giorni lavorativi tra l'emissione di un ordine e l'effettivo ricevimento. Per poter adempiere facilmente ad una funzionalità di questo tipo, può essere utile avere una funzione simile alla DATEADD, che possa però escludere i sabati e le domeniche. Il codice seguente opera nel modo appena descritto.
Utilizzo del codice
Il seguente codice va copiato ed incollato in una videata query di SQL Management Studio, premendo quindi il tasto Esegui per effettuare la creazione della funzione, ed averla quindi disponibile per le future queries ed elaborazioni.
CREATE FUNCTION DAYSADDNOWK(@addDate AS DATE, @numDays AS INT)
RETURNS DATETIME
AS
BEGIN
SET @addDate = DATEADD(d, @numDays, @addDate)
IF DATENAME(DW, @addDate) = 'sunday' SET @addDate = DATEADD(d, 1, @addDate)
IF DATENAME(DW, @addDate) = 'saturday' SET @addDate = DATEADD(d, 2, @addDate)
RETURN CAST(@addDate AS DATETIME)
END
GO
La nuova funzione andrà eseguita nel modo seguente:
SELECT dbo.DAYSADDNOWK(GETDATE(), 3)
Qui GETDATE()
sarà sostituito dalla data per cui si necessita eseguire il calcolo. Il valore "3", riportato nell'esempio, è il numero di giorni lavorativi da aggiungere, e può quindi essere sostituito da un qualsiasi valore numerico intero.
Dettaglio funzione, ed una seconda implementazione
La funzione sopra riportata è piuttosto semplice in termini di funzionamento: riceve una data, somma il numero di giorni fornito, e quindi procede a verificare il giorno settimanale risultante. Nel caso il risultato cada di sabato, provvederà ad aggiungervi due giorni, mentre nel caso sia domenica, ne aggiungerà uno soltanto, in modo da spostare il risultato finale al primo lunedì successivo. Se da un lato tale implementazione è utile nel caso, ad esempio, di un ordine da evadere entro sette giorni, risulta però evidente almeno un limite. Si supponga di necessitare di dieci giorni per far transitare la merce da un fornitore al nostro magazzino. In questo caso avremo bisogno di verificare non soltanto un risultato finale, bensì di controllare ogni risultato intermedio, spostando in avanti il contatore dei giorni nel caso di un fine settimana. In questo modo, anche se dovessimo effettuare dei conteggi su periodi più lunghi, anche di mesi, avremo la garanzia che tutti i sabati e domeniche riscontrati nel periodo saranno scartati.
Di conseguenza, potremo modificare la funzione nel modo seguente:
CREATE FUNCTION DAYSADDNOWK(@addDate AS DATE, @numDays AS INT)
RETURNS DATETIME
AS
BEGIN
WHILE @numDays>0
BEGIN
SET @addDate=DATEADD(d,1,@addDate)
IF DATENAME(DW,@addDate)='saturday' SET@addDate=DATEADD(d,1,@addDate)
IF DATENAME(DW,@addDate)='sunday' SET @addDate=DATEADD(d,1,@addDate)
SET @numDays=@numDays-1
END
RETURN CAST(@addDate AS DATETIME)
END
GO
Altre lingue
Questo articolo è disponibile nelle seguenti localizzazioni: