Tempo fa ho realizzato un sistema per automatizzare alcune attività di uno sportello comunale, in modo che i cittadini potessero usufruire di alcuni particolare servizi in orari extra lavorativi.

Al fine di misurare l'effettiva efficacia dell'azione, dopo qualche mese, ho dovuto effettuare una statistica per ottenere la suddivisione percentuale fra i servizi fruiti durante gli intervalli di apertura e di chiusura del comune. I dati dovevano essere quindi filtrati in base all'intervallo orario ed in base al fatto che il giorno considerato fosse o meno un giorno feriale.

La cosa è piuttosto semplice, ma può diventare un pò più triviale nel momento in cui si volesse scrivere del codice in grado di funzionare con impostazioni internazionali del server diverse.

L'occasione mi ha permesso di leggere SQL Server: Determining Whether a Date is a Business Day di Baya Pavliashvili su Informit.com; si tratta di un articolo molto interessante su come le impostazioni internazionali impattino sulle funzioni relative alle date di SQL Server. Nell'articolo viene proposta un'implementazione di una funzione fn_isbusinessday che ritengo poco elegante (i GOTO proprio no!).

Ryan Farley nel suo post Determining if a Date is a Weekday in T-SQL ne ha dato un'interpretazione, a mio avviso, migliore.

Di seguito il codice:

create function fn_IsWeekDay
(
    @date datetime
)
returns bit
as
begin
    declare @dtfirst int
    declare @dtweek int
    declare @iswkday bit
    set @dtfirst = @@datefirst - 1
    set @dtweek = datepart(weekday, @date) - 1
    if (@dtfirst + @dtweek) % 7 not in (5, 6)
        set @iswkday = 1 --business day
    else
        set @iswkday = 0 --weekend

    return @iswkday
end

if dbo.fn_IsWeekDay(@date) = 1 begin --do some magic here ;-) end --or select a.SomeFieldsForCalculation from table a where dbo.fn_IsWeekDay(a.SomeDateField) = 1