Comment obtenir la dernière date de la dernière semaine en sql? Je veux dire la date du dimanche dernier en utilisant la requête?
Indépendamment du réglage actuel de DATEFIRST, le dernier dimanche pourrait être trouvé comme ceci:
SELECT DATEADD(day,
-1 - (DATEPART(weekday, GETDATE()) + @@DATEFIRST - 2) % 7,
GETDATE()
) AS LastSunday
Remplacez GETDATE()
par le paramètre @date
pour obtenir le dernier dimanche précédant une date donnée.
Dimanche dernier (Quel est la fin de "semaine dernière")
SELECT DATEADD(wk, DATEDIFF(wk, 6, CURRENT_TIMESTAMP), 6) AS LAST_SUNDAY
Cette semaine (En supposant le format de la semaine du lundi au dimanche)
SELECT DATEADD(wk, DATEDIFF(wk, 7, CURRENT_TIMESTAMP), 7) AS START_OF_WEEK
SELECT DATEADD(wk, DATEDIFF(wk, 6, CURRENT_TIMESTAMP), 6 + 7) AS END_OF_WEEK
Résultats
START_OF_WEEK
-----------------------
2011-05-02 00:00:00.000
END_OF_WEEK
-----------------------
2011-05-08 00:00:00.000
Exemples pour expliquer le vaudou (Utilisez ceci pour changer le code SQL ci-dessus en votre semaine de début et de fin de semaine souhaitée)
SQL ci-dessous
SELECT DATEADD(wk, DATEDIFF(wk, -2, CURRENT_TIMESTAMP), -2) AS DAY_OF_WEEK /* Saturday */
SELECT DATEADD(wk, DATEDIFF(wk, -1, CURRENT_TIMESTAMP), -1) AS DAY_OF_WEEK /* Sunday */
SELECT DATEADD(wk, DATEDIFF(wk, 0, CURRENT_TIMESTAMP), 0) AS DAY_OF_WEEK /* Monday */
SELECT DATEADD(wk, DATEDIFF(wk, 1, CURRENT_TIMESTAMP), 1) AS DAY_OF_WEEK /* Tuesday */
SELECT DATEADD(wk, DATEDIFF(wk, 2, CURRENT_TIMESTAMP), 2) AS DAY_OF_WEEK /* Wednesday */
SELECT DATEADD(wk, DATEDIFF(wk, 3, CURRENT_TIMESTAMP), 3) AS DAY_OF_WEEK /* Thursday */
SELECT DATEADD(wk, DATEDIFF(wk, 4, CURRENT_TIMESTAMP), 4) AS DAY_OF_WEEK /* Friday */
SELECT DATEADD(wk, DATEDIFF(wk, 5, CURRENT_TIMESTAMP), 5) AS DAY_OF_WEEK /* Saturday */
SELECT DATEADD(wk, DATEDIFF(wk, 6, CURRENT_TIMESTAMP), 6) AS DAY_OF_WEEK /* Sunday */
SELECT DATEADD(wk, DATEDIFF(wk, 7, CURRENT_TIMESTAMP), 7) AS DAY_OF_WEEK /* Monday */
SELECT DATEADD(wk, DATEDIFF(wk, 8, CURRENT_TIMESTAMP), 8) AS DAY_OF_WEEK /* Tuesday */
SELECT DATEADD(wk, DATEDIFF(wk, 9, CURRENT_TIMESTAMP), 9) AS DAY_OF_WEEK /* Wednesday */
SELECT DATEADD(wk, DATEDIFF(wk, 10, CURRENT_TIMESTAMP), 10) AS DAY_OF_WEEK /* Thursday */
SELECT DATEADD(wk, DATEDIFF(wk, 11, CURRENT_TIMESTAMP), 11) AS DAY_OF_WEEK /* Friday */
SELECT DATEADD(wk, DATEDIFF(wk, 12, CURRENT_TIMESTAMP), 12) AS DAY_OF_WEEK /* Saturday */
etc...
Voici un excellent article sur la façon de procéder:
http://www.objectreference.net/post/SQL-Find-last-week-date-range.aspx
Vous voudriez utiliser la variable @StartOfPrevWeek.
DECLARE @LastSunday DATETIME
-- This will get the previous Sunday with time as 23:59:59
SELECT @LastSunday = Dateadd(SECOND, -1, Dateadd(WK, Datediff(WK, 6,
CURRENT_TIMESTAMP)
, 7))
SELECT @LastSunday
-- This gets the monday prior to it and time of 00:00:00
SELECT Dateadd(SECOND, 1, Dateadd(DAY, -7, @LastSunday))
-- This will make you time spans between eg, Monday 16/07/2012 00:00:00 through to Sunday 22/07/2012 23:59:59
-- Then use them in your WHERE clause like this
-- SELECT X,Y,Z From SomeTable
-- WHERE DateField BETWEEN @PreviousMondayToLastSunday AND @LastSunday
Pour obtenir le dimanche précédent, ou aujourd'hui si aujourd'hui est dimanche, essayez ceci
DATEADD(day,- (DATEPART(dw,getdate()) + @@DATEFIRST -1) % 7, getdate())
Cela vous donnera le vendredi prochain et précieux à partir d'une date et heure donnée
DECLARE @PREVIOUS int, @dtmStart datetime,@dtmEnd datetime, @NEXT int;
SET @dtmStart = '12/10/2013';
SET @dtmEnd = '12/11/2013';
select @PREVIOUS = datepart(dw,@dtmStart)
WHILE @PREVIOUS <> 6
BEGIN
SET @dtmStart = DATEADD(day , -1 ,@dtmStart)
SET @PREVIOUS = datepart(dw,@dtmStart)
CONTINUE
END
select @dtmStart
SELECT @NEXT = DATEPART(dw, @dtmEnd)
WHILE @NEXT <> 6
BEGIN
SET @dtmEnd = DATEADD(day , 1 ,@dtmEnd)
SET @NEXT = datepart(dw,@dtmEnd)
CONTINUE
END
select @dtmEnd
SELECT (DATEADD(DAY, ((DATEPART(dw, @Date) - 1) * -1), @Date))
Le SQL est plus simple avec une table de calendrier appropriée. Pas de vaudou.
select max(cal_date) end_of_last_week
from calendar
where (cal_date < current_date and day_of_week = 'Sun');
end_of_last_week
--
2011-05-01