¿Consulta MySQL para seleccionar datos de la semana pasada?

96

Hola, tengo una tabla con un campo de fecha y alguna otra información. Quiero seleccionar todas las entradas de la semana pasada (la semana comienza desde el domingo).

valores de la tabla:

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

Quiero seleccionar todos los identificadores de la semana pasada, la salida esperada es 5, 6, 8. (el id 2 no está en la semana pasada y el id 15 está en la semana actual).

Cómo escribir y consulta SQL para el mismo.

coderex
fuente
Entonces, solo para aclarar, ¿desea datos desde el domingo, no necesariamente 7 días de datos? Entonces, si hoy es lunes, obtendrás 2 días de datos (domingo y lunes).
Brendan Long
Domingo a Sábado. No duran 7 días
coderex
No tengo ganas de convertir esto a SQL en este momento, pero puede encontrar un algoritmo para determinar el día de la semana en Wikipedia, y luego usarlo para decidir qué tan atrás buscar: en.wikipedia.org/wiki/ …
Brendan Long
@Brendan Long: podría usarlo SELECT id FROM tbl WHERE WEEK(date, 0) = WEEK(NOW(), 0) - 1durante semanas, pero supongo que su objetivo no son las semanas reales. Al menos no mencionó cosas como ISO-8601, o si quiere que se tome en consideración el cambio de año.
Jürgen Thelen
Para mí la respuesta esWHERE table.column >= DATE(NOW()) - INTERVAL 7 DAY
Connor Leech

Respuestas:

123
SELECT id FROM tbl
WHERE date >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY
AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY
piotrm
fuente
1
Hola, Cómo llegar la semana pasada con inicio de semana definido de lunes a domingo
Xman Classical
5
@Graph Sí, el script SQL anterior será así: SELECT id FROM tbl WHERE DATE> DATE_SUB (DATE (NOW ()), INTERVAL DAYOFWEEK (NOW ()) + 6 DAY) AND DATE <= DATE_SUB (DATE (NOW () )), INTERVAL DAYOFWEEK (AHORA ()) - 1 DÍA)
Xman Classical
7
devuelve los últimos 7 días en lugar de la semana pasada
kazuar
134
select id from tbname
where date between date_sub(now(),INTERVAL 1 WEEK) and now();
Vishwanath Dalvi
fuente
1
Esto no resuelve la pregunta de OP si ejecutaste esto en '2011-05-22' obtendrás id 15...
Cesar
2
Esta es la mejor respuesta.
Jad Chahine
21
SELECT id FROM table1
WHERE YEARWEEK(date) = YEARWEEK(NOW() - INTERVAL 1 WEEK)

Utilizo la función YEARWEEK específicamente para volver a la semana anterior completa (a diferencia de 7 días antes de hoy). YEARWEEK también permite un segundo argumento que establecerá el inicio de la semana o determinará cómo se maneja la primera / última semana del año. YEARWEEK le permite mantener el número de semanas para retroceder / avanzar en una sola variable, y no incluirá el mismo número de semanas de años anteriores / futuros, y es mucho más corto que la mayoría de las otras respuestas aquí.

corteza de tiempo
fuente
2
Por lo que puedo decir, esta es la única respuesta que realmente responde correctamente a la pregunta de los OP. La pregunta era cómo obtener registros de la semana anterior . Muchas de las respuestas aquí son realmente incorrectas.
squarewav
Si también desea especificar el día de inicio de la semana, proporcione el segundo argumento a YEARWEEK (): WHERE YEARWEEK(dateColumnFromTbl, 1) = YEARWEEK(CURDATE() - INTERVAL 1 WEEK, 1)
stamster
13

Forma simplificada:

Datos de la semana pasada:

SELECT id FROM tbl


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

Datos de hace 2 semanas:

SELECT id FROM tbl


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

Violín SQL

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

Anam
fuente
¿Qué pasa en la primera semana del año?
Christian Goetze
1
¿La pregunta era seleccionar datos de la semana pasada? Si es la primera semana del año y desea seleccionar los datos de la última semana, la consulta devolverá la última semana del año anterior.
Anam
4
Entonces estoy confundido por el YEAR (date) = YEAR (current_date). ¿Cómo puede eso seleccionar el año anterior?
Christian Goetze
8

Puede hacer su cálculo en php y luego agregarlo a su consulta:

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

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

ahora esto dará la fecha de hace una semana

Ibu
fuente
5

Probablemente la forma más sencilla sería:

SELECT id
FROM table
WHERE date >= current_date - 7

Durante 8 días (es decir, de lunes a lunes)

inútil
fuente
3

POR FAVOR, gente ... 'La semana pasada' como pidió el OP y donde estaba buscando (pero no encontré ninguna respuesta satisfactoria) es LA ÚLTIMA SEMANA.

Si hoy es martes, la ÚLTIMA SEMANA es el lunes HACE UNA SEMANA al domingo HACE UNA SEMANA .

Entonces:

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

O por semanas ISO:

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

Deberá calcular qué día en relación con hoy es domingo en su middleware (php, python, etc.) *

Luego,

select id
from table
where date >= "$sunday-date" + interval 7 DAY
  • también puede ser una forma de obtener la fecha del domingo relativa a hoy en MySQL; Esa sería posiblemente la solución más limpia si no es demasiado cara de realizar
virtuosos
fuente
2

Puede estar en una sola línea:

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

Una forma sencilla puede ser esta, este es un ejemplo real de mi código y funciona perfectamente:

where("actions.created_at >= DATE_SUB(CURDATE(), INTERVAL 1 WEEK)")
Javier Rodríguez Ortiz
fuente
1

La consulta anterior no funcionará. Después de la wherecláusula, si no podemos CASTel valor de la columna, entonces no funcionará. Debierascast el valor de la columna.

p.ej:

SELECT.....
WHERE CAST( yourDateColumn AS DATE ) > DATEADD( DAY, -7, CAST( GETDATE() AS DATE )
usuario7821340
fuente
0
SELECT id  FROM tb1
WHERE 
YEARWEEK (date) = YEARWEEK( current_date -interval 1 week ) 
Manoj
fuente
1
Explique por qué su código responde a la pregunta del autor de la pregunta.
Josh Burgess
0

A menudo también hago una verificación rápida de la "última semana" y lo siguiente tiende a funcionar bien para mí e incluye el día de hoy.

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 

Si desea que esto NO incluya hoy, simplemente reste un día adicional del @EndDate. Si selecciono estas dos variables hoy, obtengo

@StartDate 2015-11-16 16: 34: 05.347 / * Último lunes * /

@EndDate 2015-11-23 16: 34: 05.347 / * Este lunes * /

Si quisiera de domingo a domingo, tendría lo siguiente.

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

@StartDate 2015-11-15 16: 34: 05.347 / * Domingo anterior * /

@EndDate 2015-11-22 16: 34: 05.347 / * Último domingo * /

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

También puedes usarlo de manera fácil

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

Use esto para la semana que comienza el DOMINGO:

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

Aquí hay una forma de obtener registros de la última semana, mes y año en MySQL.

La semana pasada

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

El mes pasado

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

El año pasado

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

Si está buscando recuperar registros en los últimos 7 días, puede usar el fragmento a continuación:

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

Prueba esto:

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
fuente
-5

Si ya conoce las fechas, simplemente puede usar between, así:

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