MySQL Query per selezionare i dati della scorsa settimana?

Ciao ho una tabella con un campo data e altre informazioni. Voglio selezionare tutte le voci della settimana passata (settimana a partire 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 settimana scorsa, l’output previsto è 5, 6, 8. (id 2 non in settimana scorsa e id 15 in settimana corrente.)

Come scrivere e SQL Query per lo stesso.

 SELECT id FROM tbl WHERE date >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY 
 select id from tbname where date between date_sub(now(),INTERVAL 1 WEEK) and now(); 

Forma semplificata:

Dati della settimana scorsa:

 SELECT id FROM tbl WHERE WEEK (date) = WEEK( current_date ) - 1 AND YEAR( date) = YEAR( current_date ); 

2 settimane fa dati:

 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

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

Io uso la funzione YEARWEEK in modo specifico per tornare alla settimana precedente dell’intero calendario (rispetto a 7 giorni prima di oggi). YEARWEEK consente inoltre un secondo argomento che imposta l’inizio della settimana o determina come viene gestita la prima / ultima settimana dell’anno. YEARWEEK ti consente di mantenere il numero di settimane per tornare indietro / avanti 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.

Puoi effettuare i tuoi calcoli in php e aggiungerlo alla tua query:

 $date = date('Ymd H:i:s',time()-(7*86400)); // 7 days ago $sql = "SELECT * FROM table WHERE date <='$date' "; 

ora questo darà la data per una settimana fa

Probabilmente il modo più semplice sarebbe:

 SELECT id FROM table WHERE date >= current_date - 7 

Per 8 giorni (cioè lunedì – lunedì)

Avrai bisogno di calcolare quale giorno relativo a oggi è domenica nel tuo middleware (php, python, ecc.) *

Poi,

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

Può essere in una sola riga:

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

La query sopra non funzionerà. Dopo la clausola where, se non possiamo CAST il valore della colonna, allora non funzionerà. Dovresti cast il valore della colonna.

per esempio:

 SELECT..... WHERE CAST( yourDateColumn AS DATE ) > DATEADD( DAY, -7, CAST( GETDATE() AS DATE ) 

Un modo semplice può essere questo, questo è un esempio reale del mio codice e funziona perfettamente:

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

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

Se oggi è martedì, l’ ULTIMA SETTIMANA è lunedì UNA SETTIMANA AGO alla domenica UNA SETTIMANA AGO .

Così:

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

Oppure per le settimane ISO:

 WHERE WEEK(yourdate, 3) = WEEK(NOW(), 3) - 1 
 SELECT id FROM tb1 WHERE YEARWEEK (date) = YEARWEEK( current_date -interval 1 week ) 

Spesso faccio anche un rapido controllo della “scorsa settimana” e il seguente 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 si desidera che questo NON includa oggi, basta sottrarre un giorno in più dal @ EndDate. Se seleziono queste due variabili oggi ottengo

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

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

Se volessi domenica a domenica avrei il seguente.

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

 WHERE yourDateColumn > DATEADD(DAY, -7, GETDATE()) ; 

Puoi anche usarlo come metodo

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

Io uso questo per l’inizio settimana da DOMENICA:

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

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 

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

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