Query MySQL per selezionare i dati della scorsa settimana?


96

Salve, ho una tabella con un campo data e alcune altre informazioni. Desidero selezionare tutte le voci dell'ultima settimana (inizio settimana da domenica).

valori della tabella:

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

Voglio selezionare tutti gli ID della scorsa settimana, l'output previsto è 5, 6, 8. (ID 2 non nell'ultima settimana e ID 15 è nella settimana corrente).

Come scrivere e SQL Query per lo stesso.


Quindi, solo per chiarire, vuoi dati da domenica, non necessariamente 7 giorni di dati? Quindi se oggi è lunedì riceverai 2 giorni di dati (domenica e lunedì)?
Brendan Long,

Dalla domenica al sabato. Non ultimi 7 giorni
coderex

Non mi sento di convertirlo in SQL in questo momento, ma puoi trovare un algoritmo per determinare il giorno della settimana su Wikipedia, e poi usarlo per decidere quanto indietro guardare: en.wikipedia.org/wiki/ ...
Brendan Long,

@Brendan Long: potrebbe usarlo SELECT id FROM tbl WHERE WEEK(date, 0) = WEEK(NOW(), 0) - 1per settimane, ma immagino che il suo obiettivo non siano le vere settimane del calendario. Almeno non ha menzionato s / t come ISO-8601, o se vuole che venga preso in considerazione il cambio di anno.
Jürgen Thelen

Per me la risposta èWHERE table.column >= DATE(NOW()) - INTERVAL 7 DAY
Connor Leech

Risposte:


123
SELECT id FROM tbl
WHERE date >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY
AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY

1
Ciao, Come ottenere la scorsa settimana con inizio settimana definito dal lunedì alla domenica
Xman Classical

5
@Graph Sì, lo script SQL sopra sarà così: SELECT id FROM tbl WHERE DATE> DATE_SUB (DATE (NOW ()), INTERVAL DAYOFWEEK (NOW ()) + 6 DAY) E DATE <= DATE_SUB (DATE (NOW ( )), INTERVAL DAYOFWEEK (NOW ()) - 1 DAY)
Xman Classical

7
restituisce gli ultimi 7 giorni invece della scorsa settimana
kazuar

134
select id from tbname
where date between date_sub(now(),INTERVAL 1 WEEK) and now();

1
Questo non risolve la domanda OP se si esegue questo su "2011-05-22" si otterrebbe id 15...
Cesar

2
Questa è la migliore risposta.
Jad Chahine

21
SELECT id FROM table1
WHERE YEARWEEK(date) = YEARWEEK(NOW() - INTERVAL 1 WEEK)

Uso la funzione SETTIMANA ANNO in modo specifico per tornare all'intera settimana di calendario precedente (invece di 7 giorni prima di oggi). YEARWEEK consente anche un secondo argomento che imposterà l'inizio della settimana o determinerà come vengono gestite la prima / ultima settimana dell'anno. YEARWEEK ti consente di mantenere il numero di settimane per andare avanti / indietro in una singola variabile e non includerà lo stesso numero di settimana degli anni precedenti / futuri, ed è molto più breve della maggior parte delle altre risposte qui.


2
Per quanto ne so, questa è l'unica risposta che effettivamente risponde correttamente alla domanda dei PO. La domanda era come ottenere i record della settimana precedente . Molte delle risposte qui sono in realtà errate.
squarewav

Se si desidera specificare anche il giorno di inizio della settimana, fornire il secondo argomento a YEARWEEK (): WHERE YEARWEEK(dateColumnFromTbl, 1) = YEARWEEK(CURDATE() - INTERVAL 1 WEEK, 1)
stamster

13

Forma semplificata:

Dati della scorsa settimana:

SELECT id FROM tbl


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

Dati di 2 settimane fa:

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


Cosa succede nella prima settimana dell'anno?
Christian Goetze

1
La domanda era selezionare i dati della scorsa settimana? Se la prima settimana dell'anno e si desidera selezionare i dati dell'ultima settimana, la query restituirà l'ultima settimana dell'anno precedente.
Anam

4
Sono solo confuso da YEAR (data) = YEAR (current_date) allora. Come può selezionare l'anno precedente?
Christian Goetze

8

Puoi fare il tuo calcolo in php e poi aggiungerlo alla tua query:

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

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

ora questo darà la data di una settimana fa


5

Probabilmente il modo più semplice sarebbe:

SELECT id
FROM table
WHERE date >= current_date - 7

Per 8 giorni (es. Lunedì - lunedì)


3

PER FAVORE persone ... "La scorsa settimana" come mi ha chiesto l'OP e dove stavo cercando (ma non ho trovato nessuna risposta soddisfacente) è L'ULTIMA SETTIMANA.

Se oggi è martedì, l' ULTIMA SETTIMANA è da lunedì UNA SETTIMANA FA a domenica UNA SETTIMANA FA .

Così:

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

O per settimane ISO:

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

2

Dovrai calcolare quale giorno rispetto a oggi è domenica nel tuo middleware (php, python, ecc.) *

Poi,

select id
from table
where date >= "$sunday-date" + interval 7 DAY
  • potrebbe essere un modo per ottenere la data di domenica relativa a oggi anche in MySQL; sarebbe probabilmente la soluzione più pulita se non troppo costosa da eseguire

2

Può essere in una singola riga:

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

2

Un modo semplice può essere questo, questo è un vero esempio tratto dal mio codice e funziona perfettamente:

where("actions.created_at >= DATE_SUB(CURDATE(), INTERVAL 1 WEEK)")

1

La query precedente non funzionerà. Dopo la whereclausola, se non possiamo CASTil valore della colonna, allora non funzionerà. Dovresti castil valore della colonna.

per esempio:

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
Spiega perché il tuo codice risponde alla domanda del richiedente.
Josh Burgess

0

Faccio spesso anche un rapido controllo della "scorsa settimana" e quanto segue tende a funzionare bene per me e include oggi.

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 

Se vuoi che questo NON includa oggi, sottrai un giorno in più da @EndDate. Se seleziono queste due variabili oggi ottieni

@StartDate 2015-11-16 16: 34: 05.347 / * Ultimo lunedì * /

@EndDate 2015-11-23 16: 34: 05.347 / * Questo lunedì * /

Se volessi da domenica a domenica avrei quanto segue.

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

@StartDate 2015-11-15 16: 34: 05.347 / * Domenica precedente * /

@EndDate 2015-11-22 16: 34: 05.347 / * Ultima domenica * /



0

Puoi anche usarlo in un modo o nell'altro

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

0

lo uso per la settimana a partire da DOMENICA:

SELECT id FROM tbl
WHERE
date >= curdate() - INTERVAL DAYOFWEEK(curdate())+5 DAY  
AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-2 DAY


0

Ecco un modo per ottenere i record della settimana, del mese e dell'anno in MySQL.

La settimana scorsa

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

Lo scorso mese

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

L'anno scorso

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

0

Se stai cercando di recuperare i record negli ultimi 7 giorni, puoi utilizzare lo snippet di seguito:

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

-1

Prova questo:

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

Se conosci già le date, puoi semplicemente utilizzare tra, in questo modo:

SELECT id    
FROM `Mytable`    
where MyDate BETWEEN "2011-05-15" AND "2011-05-21"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.