Angenommen, wir definieren den Sonntag als ersten Tag der Woche
SET DATEFIRST 7
, dann liefert
SELECT DATEADD(DAY, 1-DATEPART(dw, GETDATE()), GETDATE())
------------------------------------------------------
2005-09-12 15:51:43.660
(1 row(s) affected)
zurück. Falls der Zeitanteil keine Rolle spielt, ist diese Lösung durchaus verwendbar. Etwas störend ist hingegen, daß man abhängig ist von der SET DATEFIRST Einstellung. Wenn man diese Abhängigkeit vermeiden möchte, kann man auf eine der folgenden Alternativen zurückgreifen:
SELECT
CAST(CONVERT(CHAR(8), GETDATE(), 112) AS DATETIME)
-
DATEPART(WEEKDAY, GETDATE()+@@DATEFIRST-1) + 1
------------------------------------------------------
2005-09-12 00:00:00.000
(1 row(s) affected)
oder
SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()),0)
------------------------------------------------------
2005-09-12 00:00:00.000
(1 row(s) affected)
Vielfach findet so ein Algorithmus Anwendung, wenn man anhand einer gegebenen Wochennummer den ersten Tag dieser Woche herausfinden soll. In so einem Fall kann man auch auf folgendes zurückgreifen:
DECLARE @Woche INT
SET @Woche = 37
SELECT '20050101' + DATEADD(d, @Woche * 7, DATEPART(wk, '20050101')
- (7 - @@DATEFIRST)) - @@DATEFIRST + 1
------------------------------------------------------
2005-09-12 00:00:00.000
(1 row(s) affected)
Angenehmer Nebeneffekt der letzten drei Alternativen ist, daß der Zeitanteil auf Mitternacht gesetzt wird.