web-dev-qa-db-fra.com

Comment obtenir le dernier jour de la semaine dernière en sql?

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? 

31
James123

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.

36
Andriy M

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)

  • Les exemples ci-dessous permettent de localiser les jours de la semaine de la semaine en cours (du dimanche au samedi).
  • Si END_OF_WEEK correspond à la semaine du dimanche au samedi, vous devez attribuer la valeur +7 à la valeur de cette semaine. (Voir l'exemple END_OF_WEEK ci-dessus.)

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...
19
beach

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.

3
IAmTimCorey
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 
2
Tom

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())
1
FistOfFury

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
0
Mina Gabriel
SELECT (DATEADD(DAY, ((DATEPART(dw, @Date) - 1) * -1), @Date))
0
Mark W

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