webentwicklung-frage-antwort-db.com.de

Wie bekomme ich den letzten Tag der letzten Woche in sql?

Wie bekomme ich das letzte Datum der letzten Woche in sql? Ich meine letzten Sonntag mit Abfrage? 

31
James123

Unabhängig von der tatsächlichen DATEFIRST-Einstellung könnte der letzte Sonntag folgendermaßen gefunden werden:

SELECT DATEADD(day,
               -1 - (DATEPART(weekday, GETDATE()) + @@DATEFIRST - 2) % 7,
               GETDATE()
              ) AS LastSunday

Ersetzen Sie GETDATE() durch einen Parameter @date, um den letzten Sonntag vor einem bestimmten Datum abzurufen.

36
Andriy M

Letzter Sonntag (Welches ist das Ende von "letzte Woche")

SELECT DATEADD(wk, DATEDIFF(wk, 6, CURRENT_TIMESTAMP), 6) AS LAST_SUNDAY

Diese Woche (Mo-So-Woche-Format annehmen)

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

Ergebnisse

START_OF_WEEK
-----------------------
2011-05-02 00:00:00.000

END_OF_WEEK
-----------------------
2011-05-08 00:00:00.000

Beispiele zur Erläuterung des Voodoo (Verwenden Sie diese Option, um oben in SQL die gewünschte Woche zu ändern, die den Wochentag beginnt und die Woche endet.)

  • Die folgenden Beispiele zeigen Wochentage innerhalb der aktuellen Woche (Sonntag bis Samstag).
  • Wenn die tatsächliche END_OF_WEEK nächste Sun-Sa-Woche ist, müssen Sie den Wert dieser Woche um +7 erhöhen. (Siehe das END_OF_WEEK-Beispiel oben.)

SQL unter

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

Hier ist ein großartiger Artikel, wie das geht:

http://www.objectreference.net/post/SQL-Find-last-week-date-range.aspx

Sie möchten die Variable @StartOfPrevWeek verwenden.

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

Um den vorherigen Sonntag zu erhalten, oder heute, wenn heute Sonntag ist, probieren Sie es aus

DATEADD(day,- (DATEPART(dw,getdate()) + @@DATEFIRST -1) % 7, getdate())
1
FistOfFury

Dadurch erhalten Sie den nächsten und wertvollen Freitag von einem bestimmten Datum und einer bestimmten Uhrzeit 

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

Das SQL ist mit einer geeigneten Kalendertabelle einfacher. Kein Voodoo.

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