2009-06-18 33 views
5

Lavoro in un college e la data di inizio dell'anno accademico dei nostri sistemi di gestione degli studenti è determinata dal lunedì o prima del 1 agosto. Ho bisogno di abbinare questo nella mia domanda, c'è un modo per ottenere facilmente la data del lunedì o prima di questa data.T-sql Lunedì prima della data

risposta

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 luglio 2009, che è il Lunedi entro il 1 ° agosto Modifica al 2005, quando 1 agosto è stato un Lunedi e la query restituirà 08-01

1

È possibile utilizzare datepart per ottenere il giorno della settimana, quindi eseguire una piccola operazione di ritorno nel lunedi. Questo esempio utilizza l'impostazione predefinita USA di datefirst 7 (in cui il lunedì è il giorno 2 della settimana). Regola i giorni da aggiungere per essere il giorno della settimana in cui il lunedì è per le tue impostazioni internazionali.

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

L'ho contrassegnato come segue poiché restituisce un risultato errato: selezionare dateadd (dd, -datepart (dw, '2011-05-15') + 2, '2011 -05-15'). Questo restituisce '2011-05-16'. –

0

molto 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

si tratta di un algoritmo generico che restituirà il primo Lunedi di ogni mese (@inputdate):

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

È un metodo comune per ottenere il primo lunedì del mese in SQL Server. Questo link spiega come il calcolo precedente funziona insieme a molti altri calcoli di date.

Ecco come l'algoritmo di cui sopra potrebbe essere utilizzato per ottenere il Lunedi o prima del 1 ° giorno di un mese:

-- 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

La risposta accettata non ha funzionato per me, perché avevo bisogno sia un Domenica settimana e un lunedì settimana nella stessa query. Questo funziona attraverso diversi "DATEFIRST" Impostazioni:

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

"DATEPART (DW, '19.000.101')" determinerà il vostro "DATEFIRST" impostazione dal 1900-01-01 era su un Lunedi. Se si desidera una settimana basata sul martedì, è possibile modificare 19000101 a 19000102.

BTW, '20110515' è l'unico formato di data che funziona in tutte le impostazioni cultura di SQL Server. Date come "2011-05-06" verranno erroneamente interpretate in alcuni paesi. (credito a Itzik Ben-Gan per indicarlo)

+0

+1 per un'elegante soluzione agnostica "datefirst". –

+0

Bello, dovrebbe essere la risposta accettata – nhaberl

Problemi correlati