2009-06-18 13 views
5

Ich arbeite an einer Hochschule und das Startdatum unseres Studentenmanagementsystems wird durch den Montag am oder vor dem 1. August festgelegt. Ich muss dies in meiner Abfrage übereinstimmen, gibt es eine Möglichkeit, das Datum des Montags an oder vor diesem Datum leicht zu erhalten.T-sql Montag vor dem Datum

Antwort

2
set datefirst 1; -- Make Monday the first day of the week 

select dateadd(dd, -1*(datepart(dw, '2009-08-01')-1), '2009-08-01') 

Returns 27. Juli 2009, die am Montag am oder vor dem 1. Ändern August es bis 2005 ist, wenn 1. August ein Montag und die Abfrage war kehrt 08-01

1

Sie könnten datepart verwenden, um den Wochentag zu erhalten, und dann tun Sie ein wenig Mathe, um in Ihren Montag zurückzukehren. In diesem Beispiel wird der US-Standardwert von datefirst 7 verwendet (Montag ist Tag 2 der Woche). Passen Sie die hinzuzufügenden Tage so an, dass der Wochentag, den Montag für Ihr Gebietsschema ist.

select dateadd(dd, -datepart(dw, '2009-08-01') + 2, '2009-08-01') 
+0

Ich markierte dies, da das Folgende ein falsches Ergebnis zurückgibt: select dateadd (dd, -Datumsteil (dw, '2011-05-15') + 2, '2011 -05-15 '). Dies gibt "2011-05-16" zurück. –

0

sehr hacky

DECLARE @weekday int 

SELECT @weekday = DATEPART(WEEKDAY, '1-Aug-2009') 

SELECT CASE 
WHEN @weekday = 1 THEN '1-Aug-2009' ELSE DATEADD (dd,(@weekday-2)*-1, '1-Aug-2009') 
END 
0

Dies ist ein generischer Algorithmus, der die ersten Montag eines jeden Monats (@inputdate) zurück:

DATEADD(wk, DATEDIFF(wk, 0, dateadd(dd, 6 - datepart(day, @inputDate), @inputDate)), 0) 

Es ist eine gängige Methode zum Abrufen des ersten Monats des Monats in SQL Server. Diese link erklärt, wie die obige Berechnung zusammen mit vielen anderen Datumsberechnungen funktioniert.

Hier ist, wie der obige Algorithmus verwendet werden, um den Montag am oder vor dem ersten Tag eines Monats zu erhalten:

-- Set month to get Monday before or at 1st of month. 
DECLARE @inputDate DATETIME 
SET @inputDate = '2009-08-01' 

-- Get first Monday of month. 
DECLARE @firstMonday DATETIME 
SET @firstMonday = DATEADD(wk, DATEDIFF(wk, 0, dateadd(dd, 6 - datepart(day, @inputDate), @inputDate)), 0) 

-- Determine date for first Monday on or before 1st of month. 
DECLARE @startDate DATETIME 
SET @startDate = @firstMonday 
IF @firstMonday > @inputDate 
    SET @startDate = DATEADD(wk, -1, @firstMonday) 

SELECT @startDate 
4

Die akzeptierte Antwort hat nicht funktioniert für mich, weil ich beide benötigt ein Sonntagswoche und eine Montagswoche in der gleichen Abfrage. Dies funktioniert über verschiedene „datefirst“ Einstellungen:

SELECT DATEADD(d, -((DATEPART(WEEKDAY, '20110515') - DATEPART(dw, '19000101') + 7) % 7), '20110515') 

„DATEPART (dw,‚19000101‘)“ wird bestimmen Ihre „datefirst“ -Einstellung seit 1900-01-01 an einem Montag war. Wenn Sie eine auf Dienstag basierende Woche möchten, können Sie 19000101 in 19000102 ändern.

BTW, '20110515' ist das einzige Datumsformat, das über alle SQL Server-Kultureinstellungen hinweg funktioniert. Termine wie "2011-05-06" werden in bestimmten Ländern falsch interpretiert. (Kredit an Itzik Ben-Gan für das Aufzeigen dieser)

+0

+1 für eine elegante, "datefirst" agnostische Lösung. –

+0

Schön, sollte die akzeptierte Antwort sein – nhaberl

Verwandte Themen