2009-06-18 5 views
5

Je travaille dans un collège et la date de début de l'année académique de nos systèmes de gestion des étudiants est fixée au lundi au plus tard le 1er août. J'ai besoin de faire correspondre cela dans ma requête, est-il un moyen d'obtenir facilement la date du lundi ou avant cette date.T-sql Lundi avant la date

Répondre

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

retour Juillet 27, 2009, qui est le lundi ou avant le 1er Août 2005 à changement quand 1 août était un lundi et la requête retournera 08-01

1

Vous pouvez utiliser datepart pour obtenir le jour de la semaine, puis faire un peu de maths pour revenir dans votre lundi. Cet exemple utilise le paramètre par défaut américain datefirst 7 (dans lequel lundi est le jour 2 de la semaine). Ajustez les jours à ajouter pour être le jour de la semaine.

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

Je l'ai marqué comme un résultat incorrect: select dateadd (dd, -datepart (dw, '2011-05-15') + 2, '2011 -05-15 '). Cela renvoie '2011-05-16'. –

0

très 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

Ceci est un algorithme générique qui renverra le premier lundi de chaque mois (de @inputdate):

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

Il s'agit d'une méthode courante pour obtenir le premier lundi du mois dans SQL Server. Ce link explique comment le calcul ci-dessus fonctionne avec beaucoup d'autres calculs de date.

Voici comment l'algorithme ci-dessus pourrait être utilisé pour obtenir le lundi au plus tard le 1er jour d'un mois:

-- 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 réponse acceptée ne fonctionne pas pour moi parce que je avais besoin à la fois un La semaine du dimanche et la semaine du lundi dans la même requête. Cela fonctionne à travers différents "DATEFIRST" Paramètres:

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

"DATEPART (dw, '19000101')" déterminera votre réglage "datefirst" depuis 1900-01-01 était un lundi. Si vous voulez une semaine en fonction mardi, vous pouvez changer 19000101 à 19000102.

BTW, « 20110515 » est le seul format de date qui fonctionne dans tous les milieux de culture SQL Server. Des dates comme '2011-05-06' seront mal interprétées dans certains pays. (crédit à Itzik Ben-Gan pour le signaler)

+0

+1 pour une solution agnostique élégante, «datefirst». –

+0

Nice, devrait être la réponse acceptée – nhaberl

Questions connexes