MySQL-Abfrage zur Auswahl von Daten aus der letzten Woche?

96

Hallo, ich habe eine Tabelle mit einem Datumsfeld und einigen anderen Informationen. Ich möchte alle Einträge der letzten Woche auswählen (Woche ab Sonntag).

Tabellenwerte:

id  date
2   2011-05-14 09:17:25
5   2011-05-16 09:17:25
6   2011-05-17 09:17:25
8   2011-05-20 09:17:25
15  2011-05-22 09:17:25

Ich möchte alle IDs der letzten Woche auswählen. Die erwartete Ausgabe ist 5, 6, 8. (ID 2 nicht in der letzten Woche und ID 15 in der aktuellen Woche.)

Wie schreibe ich und SQL Query für das gleiche.

Coderex
quelle
Um dies zu verdeutlichen, möchten Sie Daten seit Sonntag, nicht unbedingt 7 Tage Daten? Wenn heute Montag ist, erhalten Sie 2 Tage Daten (Sonntag und Montag)?
Brendan Long
Sonntag bis Samstag. Nicht die letzten 7 Tage
Coderex
Ich habe momentan keine Lust, dies tatsächlich in SQL zu konvertieren, aber Sie können einen Algorithmus finden, um den Wochentag auf Wikipedia zu bestimmen, und dann verwenden, um zu entscheiden, wie weit zurück zu schauen: en.wikipedia.org/wiki/ …
Brendan Long
@Brendan Long: Er könnte SELECT id FROM tbl WHERE WEEK(date, 0) = WEEK(NOW(), 0) - 1wochenlang verwenden, aber ich denke, sein Ziel sind keine echten Kalenderwochen. Zumindest erwähnte er nicht s / t wie ISO-8601 oder ob er möchte, dass der Jahreswechsel berücksichtigt wird.
Jürgen Thelen
Für mich ist die AntwortWHERE table.column >= DATE(NOW()) - INTERVAL 7 DAY
Connor Leech

Antworten:

123
SELECT id FROM tbl
WHERE date >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY
AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY
piotrm
quelle
1
Hallo, wie bekomme ich letzte Woche mit Woche definierten Start von Montag bis Sonntag
Xman Classical
5
@Graph Ja, das obige SQL-Skript sieht folgendermaßen aus: SELECT id FROM tbl WHERE DATE> DATE_SUB (DATE (NOW ()), INTERVAL DAYOFWEEK (NOW ()) + 6 DAY) UND DATE <= DATE_SUB (DATE (NOW) ( )), INTERVALL DAYOFWEEK (JETZT ()) - 1 TAG)
Xman Classical
7
es kehrt in den letzten 7 Tagen statt in der letzten Woche zurück
kazuar
134
select id from tbname
where date between date_sub(now(),INTERVAL 1 WEEK) and now();
Vishwanath Dalvi
quelle
1
Dies löst die OP-Frage nicht, wenn Sie dies am 22.05.2011 ausführen würden, würden Sie id 15...
Cesar
2
Dies ist die beste Antwort.
Jad Chahine
21
SELECT id FROM table1
WHERE YEARWEEK(date) = YEARWEEK(NOW() - INTERVAL 1 WEEK)

Ich verwende die YEARWEEK-Funktion speziell, um zur vorherigen ganzen Kalenderwoche zurückzukehren (im Gegensatz zu 7 Tagen vor dem heutigen Tag). YEARWEEK erlaubt auch ein zweites Argument, das den Wochenbeginn festlegt oder bestimmt, wie die erste / letzte Woche des Jahres behandelt wird. Mit YEARWEEK können Sie die Anzahl der Wochen für das Hin- und Herbewegen in einer einzelnen Variablen beibehalten und nicht die gleiche Wochenzahl aus früheren / zukünftigen Jahren angeben. Sie ist weitaus kürzer als die meisten anderen Antworten hier.

Zeitkruste
quelle
2
Soweit ich das beurteilen kann, ist dies die einzige Antwort, die die Frage des OP tatsächlich richtig beantwortet. Die Frage war, wie man Aufzeichnungen aus der Vorwoche bekommt . Viele der Antworten hier sind tatsächlich falsch.
squarewav
Wenn Sie auch den Starttag der Woche angeben möchten, geben Sie YEARWEEK () das zweite Argument: WHERE YEARWEEK(dateColumnFromTbl, 1) = YEARWEEK(CURDATE() - INTERVAL 1 WEEK, 1)
Stamster
13

Vereinfachte Form:

Daten der letzten Woche:

SELECT id FROM tbl


WHERE 
WEEK (date) = WEEK( current_date ) - 1 AND YEAR( date) = YEAR( current_date );

Vor 2 Wochen Daten:

SELECT id FROM tbl


WHERE 
WEEK (date) = WEEK( current_date ) - 2 AND YEAR( date) = YEAR( current_date );

SQL Fiddle

http://sqlfiddle.com/#!8/6fa6e/2

Anam
quelle
Was passiert in der ersten Woche des Jahres?
Christian Goetze
1
Die Frage war, Daten aus der letzten Woche auszuwählen? Wenn Sie in der ersten Woche des Jahres Daten für die letzte Woche auswählen möchten, wird die Abfrage in der letzten Woche des Vorjahres zurückgegeben.
Anam
4
Ich bin nur verwirrt durch das JAHR (Datum) = JAHR (aktuelles_Datum). Wie kann das das Vorjahr auswählen?
Christian Goetze
8

Sie können Ihre Berechnung in PHP durchführen und sie dann Ihrer Abfrage hinzufügen:

$date = date('Y-m-d H:i:s',time()-(7*86400)); // 7 days ago

$sql = "SELECT * FROM table WHERE date <='$date' ";

Jetzt wird dies das Datum für eine Woche geben

Ibu
quelle
5

Der wahrscheinlich einfachste Weg wäre:

SELECT id
FROM table
WHERE date >= current_date - 7

Für 8 Tage (dh Montag - Montag)

nutzlos
quelle
3

BITTE Leute ... 'Letzte Woche' wie das OP gefragt hat und wo ich gesucht habe (aber keine befriedigenden Antworten gefunden habe), ist DIE LETZTE WOCHE.

Wenn heute Dienstag ist, dann ist die letzte Woche Montag vor einer Woche bis Sonntag vor einer Woche .

So:

WHERE
    WEEK(yourdate) = WEEK(NOW()) - 1

Oder für ISO-Wochen:

WHERE
    WEEK(yourdate, 3) = WEEK(NOW(), 3) - 1
MS Berends
quelle
2

Sie müssen berechnen, welcher Tag im Vergleich zum heutigen Tag in Ihrer Middleware Sonntag ist (PHP, Python usw.) *

Dann,

select id
from table
where date >= "$sunday-date" + interval 7 DAY
  • kann auch eine Möglichkeit sein, das Datum des Sonntags relativ zum heutigen Tag in MySQL zu ermitteln; Das wäre wohl die sauberere Lösung, wenn sie nicht zu teuer wäre
virtuelle Augen
quelle
2

Es kann in einer einzelnen Zeile stehen:

SELECT * FROM table WHERE Date BETWEEN (NOW() - INTERVAL 7 DAY) AND NOW()
Abhinav bhardwaj
quelle
2

Ein einfacher Weg kann dieser sein, dies ist ein echtes Beispiel aus meinem Code und funktioniert perfekt:

where("actions.created_at >= DATE_SUB(CURDATE(), INTERVAL 1 WEEK)")
Javier Rodriguez Ortiz
quelle
1

Die obige Abfrage funktioniert nicht. whereWenn wir nach der Klausel CASTden Spaltenwert nicht können, funktioniert er nicht. Sie sollten castden Spaltenwert.

z.B:

SELECT.....
WHERE CAST( yourDateColumn AS DATE ) > DATEADD( DAY, -7, CAST( GETDATE() AS DATE )
user7821340
quelle
0
SELECT id  FROM tb1
WHERE 
YEARWEEK (date) = YEARWEEK( current_date -interval 1 week ) 
Manoj
quelle
1
Bitte erläutern Sie, warum Ihr Code die Frage des Fragestellers beantwortet.
Josh Burgess
0

Ich mache oft auch einen kurzen "Last Week" Check und das Folgende funktioniert normalerweise gut für mich und schließt heute ein.

DECLARE @StartDate DATETIME 
DECLARE @EndDate DATETIME 

SET @StartDate = Getdate() - 7 /* Seven Days Earlier */
SET @EndDate = Getdate() /* Now */

SELECT id 
FROM   mytable 
WHERE  date BETWEEN @StartDate AND @Enddate 

Wenn Sie möchten, dass dies heute NICHT enthalten ist, subtrahieren Sie einfach einen zusätzlichen Tag vom @EndDate. Wenn ich diese beiden Variablen heute auswähle, bekomme ich

@StartDate 2015-11-16 16: 34: 05.347 / * Letzten Montag * /

@EndDate 2015-11-23 16: 34: 05.347 / * Diesen Montag * /

Wenn ich Sonntag bis Sonntag wollte, hätte ich folgendes.

SET @StartDate = Getdate() - 8 /* Eight Days Earlier */
SET @EndDate = Getdate() - 1  /* Yesterday */

@StartDate 2015-11-15 16: 34: 05.347 / * Vorheriger Sonntag * /

@EndDate 2015-11-22 16: 34: 05.347 / * Letzten Sonntag * /

Izulien
quelle
0
WHERE yourDateColumn > DATEADD(DAY, -7, GETDATE()) ;
Veera Induvasi
quelle
0

Sie können es auch so verwenden

SELECT *
FROM   inventory
WHERE  YEARWEEK(`modify`, 1) = YEARWEEK(CURDATE(), 1)
HAROONMIND
quelle
0

i Verwenden Sie dies für die Woche ab SONNTAG:

SELECT id FROM tbl
WHERE
date >= curdate() - INTERVAL DAYOFWEEK(curdate())+5 DAY  
AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-2 DAY
Hoàng Vũ Tgtt
quelle
0

Hier finden Sie eine Möglichkeit, die letzten Wochen-, Monats- und Jahresaufzeichnungen in MySQL abzurufen.

Letzte Woche

SELECT UserName, InsertTime 
FROM tblaccounts
WHERE WEEK(InsertTime) = WEEK(NOW()) - 1;

Im vergangenen Monat

SELECT UserName, InsertTime 
FROM tblaccounts
WHERE MONTH(InsertTime) = MONTH(NOW()) - 1;

Vergangenes Jahr

SELECT UserName, InsertTime 
FROM tblaccounts
WHERE YEAR(InsertTime) = YEAR(NOW()) - 1;
M. Hamza Rajput
quelle
0

Wenn Sie Datensätze innerhalb der letzten 7 Tage abrufen möchten, können Sie das folgende Snippet verwenden:

SELECT date FROM table_name WHERE DATE(date) >= CURDATE() - INTERVAL 7 DAY;
Simo Patrek
quelle
-1

Versuche dies:

Declare @Daytype varchar(15),
        @StartDate datetime,
        @EndDate datetime
set @Daytype = datename(dw, getdate())

if @Daytype= 'Monday' 
    begin
        set @StartDate = getdate()-7 
        set @EndDate = getdate()-1

    end


else if @Daytype = 'Tuesday'

    begin
        set @StartDate = getdate()-8 
        set @EndDate = getdate()-2

    end
Else if @Daytype = 'Wednesday'
    begin
        set @StartDate = getdate()-9
        set @EndDate = getdate()-3
    end
Else if @Daytype = 'Thursday'
    begin
        set @StartDate = getdate()-10 
        set @EndDate = getdate()-4
    end

Else if @Daytype = 'Friday'

    begin
        set @StartDate = getdate()-11
        set @EndDate = getdate()-5

    end

Else if @Daytype = 'Saturday'

    begin
        set @StartDate = getdate()-12
        set @EndDate = getdate()-6

    end

Else if @Daytype = 'Sunday'

    begin
        set @StartDate = getdate()-13
        set @EndDate = getdate()-7

    end

 select @StartDate,@EndDate
Pradeep Samaranayake
quelle
-5

Wenn Sie die Daten bereits kennen, können Sie sie einfach wie folgt verwenden:

SELECT id    
FROM `Mytable`    
where MyDate BETWEEN "2011-05-15" AND "2011-05-21"
user765060
quelle