Condividi tramite


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: