Rekenen met datums kan in SQL Server 2005 op verschillende manieren. SQL Server 2005 kent verschillende functies die je kunt gebruiken als je met datums gaat werken. Dit artikel beschrijft een aantal praktische voorbeelden die je in de praktijk zult tegenkomen als je met databases en datums werkt.
Zo wordt beschreven hoe je terug kunt rekenen in de tijd, hoe je het verschil in dagen tussen diverse datums kunt uitrekenen en hoe je de maand kunt bepalen in een datum.
DATEADD()
DateAdd(datumgedeelte, getal, datumwaarde)Voorbeelden
SELECT DATEADD(dd, 2, GETDATE () ) |
In bovenstaand voorbeeld zeggen we dat hij in dagen moet rekenen (dd), de 2 geeft aan dat hij 2 dagen vooruit moet rekenen. Het derde argument geeft de datum vanaf wanneer hij moet rekenen, in dit geval vandaag (GETDATE() ). Bij GETGATE() kun je ook een datum meegeven, bijvoorbeeld ‘2008-12-05’ . Let op dat dit tussen quotes moet staan!
De datum van twee maanden geleden
SELECT DATEADD(mm, -2, GETDATE () ) |
mm geeft maanden aan. -2 geeft aan dat hij 2 maanden terug moet gaan en de GETDATE() geeft de datum van vandaag aan.
DATEPART()
Met deze functie kun je de dag, maand, jaar en tijd bepalen in een datumwaarde. Je wilt het maandgedeelte van de datum 2008-12-05 hebben, in dit geval dus 12. Je kunt ook de dag nodig hebben van 12 augustus 2007, de 12 dus.
Syntax
DatePart(datumgedeelte, datumwaarde)
Voorbeelden
De dag van vandaag
SELECT DATEPART(dd,GETDATE() ) |
Het jaarnummer van vandaag
SELECT DATEPART(yy,GETDATE() ) |
DATEDIFF()
Datediff gebruik je om een interval te berekenen tussen twee datums. Zo kun je het aantal dagen bepalen dat tussen twee datums ligt.
Syntax
DateDiff(datumgedeelte, datumwaarde1, datumwaarde2)
Voorbeelden
Het aantal dagen verschil tussen 1 december 2008 en vandaag (5 december 2008)
SELECT DATEDIFF(dd,'2008-12-01',GETDATE() ) |
DATENAME()
Datename lijkt erg op datepart. Het verschil is dat deze functie een string retourneerd (stukje tekst) en datepart retourneerd een nummer. Deze functie kan de dag van de week in tekst retourneren of de naam van de maand.
Syntax
SELECT DATENAME (dw, GETDATE() ) |
Het dagnummer van het jaar van vandaag
SELECT DATENAME (dy, GETDATE() ) |
Hieronder een tabel met waarden die je kunt invoeren als eerste argument:
Een beperking van de functie is dat de functie de engelse namen retourneerd. Ik raad daarom aan altijd gebruik te maken van een datumdimensie. Het grote voordeel van een datumdimensie is dat je voor iedere datum weet in welke week hij valt, welk jaar, welk kwartaal, etc. Daarbij moet je er rekening mee houden dat 1 januari in week 52 van het vorige jaar kan vallen. Het jaar van 1 januari is in dit geval bijvoorbeeld 2008 maar het jaar van het weeknummer is 2007.
Hallo,
Ik ben op zoek naar een functie die het aantal werkdagen aangeeft tussen 2 datums. De workweek is van maandag tm vrijdag dus zaterdag en zondag tellen niet mee.
Wie kan mij helpen?
Deze functie kan je gebruiken maar dan heb je wel een datum tabel nodig:
USE [DWH_NL_DMSA_1]
GO
/****** Object: UserDefinedFunction [dbo].[DateDiffWorkDays] Script Date: 10-2-2017 12:18:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[DateDiffWorkDays]
( @StartDateID INT, @EndDateID INT, @IncludeHolidays BIT = 0 )
—————————————————
— Name : [dbo].[DateDiffWorkDays]
— Produced By : XXX
— URL : XXX
— Author : XXX
— Date : 6 Juni 2012
— Modified : XXX
— Modfied by : XXX
— Purpose : Calculate business days between two days.
— Called by : Different SQL
— Description :
— EXAMPLE :
— SELECT dbo.DateDiffWorkDays(‘2012-05-23′,’2012-05-31’,0)
————————————————————
RETURNS INT
AS
BEGIN
DECLARE @NrOfDays INT
SELECT @NrOfDays = COUNT(*)
FROM dbo.DimDatum AS DD
WHERE DD.DatumID BETWEEN @StartDateID AND @EndDateID
AND IsWerkDag= 1
AND ( @IncludeHolidays = 1
OR IsFeestDag_PS = 0)
RETURN ( @NrOfDays )
END
GO