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.


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

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();

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.


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


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


5

Der wahrscheinlich einfachste Weg wäre:

SELECT id
FROM table
WHERE date >= current_date - 7

Für 8 Tage (dh Montag - Montag)


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

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

2

Es kann in einer einzelnen Zeile stehen:

SELECT * FROM table WHERE Date BETWEEN (NOW() - INTERVAL 7 DAY) AND NOW()

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

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 )

0
SELECT id  FROM tb1
WHERE 
YEARWEEK (date) = YEARWEEK( current_date -interval 1 week ) 

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 * /



0

Sie können es auch so verwenden

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

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


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;

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;

-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

-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"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.