Vandaag werkte ik aan een feitentabel voor mijn datawarehouse. Ik zocht een functie om het aantal “gewone weekdagen” tussen twee datums te berekenen. Ik had een record in mijn Dwh uit een HR-systeem met twee datums (begin-eind) en een aantal uren “ziek”. Een voorbeeld: iemand was ziek van 1 januari 2012 tot 28 januari 2012, voor 160 uur. Dat aantal uren moest ik over meer datums verdelen, zodat ik de ziekte-uren per datum kreeg. Dus 20120102: 8 uur ziek, 20120103: 8 uur ziek, enzovoort. Ik ging op Google op zoek naar zo’n functie en vond er een. Ik heb ook een flexibelere gemaakt, maar daarvoor heb je een datumdimensie nodig.

Deze functie berekent het aantal werkdagen / weekdagen (maandag tot en met vrijdag) tussen twee datums. Hij werkt hetzelfde als de functie datediff, maar slaat de weekenden (zaterdag - zondag) over. Het gebruik is eenvoudig: zet dit stukje code in je SELECT-statement:

SQL
SELECT dbo.DateDiffWorkDays('2012-01-07','2012-01-14')

Download de functie hieronder:

Zip-icoon DateDiffWorkDays.sql

De tweede methode is beter. Die gebruikt mijn datumdimensie. Ik neem aan dat je er ook een in je datamart gebruikt :-) Ik zet de datetime om naar een int, zodat het resultaat klopt.

Klik hier voor een voorbeeld.

Pas deze functie aan je eigen behoeften aan.

SQL
CREATE FUNCTION [dbo].[DateDiffWorkDays]
( @StartDate smalldatetime, @EndDate smalldatetime, @IncludeHolidays BIT = 0 )
RETURNS INT
AS
BEGIN
DECLARE @StartDateID INT
SET @StartDateID = CONVERT(VARCHAR,@StartDate,112)
DECLARE @EndDateID INT
SET @EndDateID = CONVERT(VARCHAR,@EndDate,112)
DECLARE @NrOfDays INT
SELECT @NrOfDays = COUNT(*)
FROM dbo.Datum AS DD
WHERE DD.DatumID BETWEEN @StartDateID AND @EndDateID
AND IsWerkDag= 1
AND ( @IncludeHolidays = 1
OR IsFeestDag_NL = 0)
RETURN ( @NrOfDays )
END
SQL

voorbeeld_datediff

Veelgestelde vragen

Hoe tel ik weekdagen tussen twee datums in SQL Server?

Gebruik een functie zoals dbo.DateDiffWorkDays('2012-01-07','2012-01-14'). Die werkt zoals DATEDIFF, maar slaat zaterdag en zondag over. De functie kun je downloaden als .sql-bestand.

Hoe sluit ik feestdagen uit als ik werkdagen tel in SQL Server?

Gebruik de tweede versie van DateDiffWorkDays, die een datumdimensie gebruikt. Die heeft een parameter @IncludeHolidays en filtert op IsWerkDag en IsFeestDag_NL.

Waarom heeft de tweede DateDiffWorkDays-functie een datumdimensie nodig?

De functie telt de rijen in de tabel dbo.Datum waar IsWerkDag = 1. Hij controleert ook de vlag voor feestdagen. De datumdimensie bevat die vlaggen, dus de functie is flexibeler.

Waarom zet DateDiffWorkDays een datetime om naar een int?

De functie zet de datums met CONVERT(VARCHAR, date, 112) om naar een int, zoals 20120107. Die vergelijkt hij met DatumID in de datumdimensie, zodat het resultaat klopt.

Hoe verdeel ik ziekte-uren over de dagen tussen twee datums?

Tel de weekdagen tussen de begin- en einddatum met een DateDiffWorkDays-functie. Verdeel daarna het totaal aantal uren over die dagen. Zo geven 160 ziekte-uren 8 uur per dag.

Reacties

Je e-mailadres wordt niet getoond. Een foto komt van Gravatar, als je die hebt.