Consulta MySQL para selecionar dados da semana passada?


96

Olá, tenho uma tabela com um campo de data e algumas outras informações. Quero selecionar todas as entradas da semana anterior, (semana começa no domingo).

valores da tabela:

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

Quero selecionar todos os ids da semana passada, a saída esperada é 5, 6, 8. (id 2 não está na semana passada e id 15 está na semana atual).

Como escrever e consultar SQL para o mesmo.


Então, só para esclarecer, você quer dados desde domingo, não necessariamente 7 dias de dados? Então, se hoje for segunda-feira, você terá 2 dias de dados (domingo e segunda-feira)?
Brendan Long

Domingo a sábado. Não últimos 7 dias
coderex

Não estou com vontade de converter isso para SQL agora, mas você pode encontrar um algoritmo para determinar o dia da semana na Wikipedia e, em seguida, usá-lo para decidir até onde olhar para trás: en.wikipedia.org/wiki/ …
Brendan Long

@Brendan Long: ele poderia usar SELECT id FROM tbl WHERE WEEK(date, 0) = WEEK(NOW(), 0) - 1durante semanas, mas acho que seu alvo não são semanas reais. Pelo menos ele não mencionou s / t como ISO-8601, ou se ele quer que a virada do ano seja levada em consideração.
Jürgen Thelen

Para mim, a resposta éWHERE table.column >= DATE(NOW()) - INTERVAL 7 DAY
Connor Leech

Respostas:


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

1
Olá, How to get last week com a semana definida começando de segunda a domingo
Xman Classical

5
@Graph Sim, o script SQL acima será assim: SELECT id FROM tbl WHERE DATE> DATE_SUB (DATE (NOW ()), INTERVAL DAYOFWEEK (NOW ()) + 6 DAY) AND DATE <= DATE_SUB (DATE (NOW ( )), INTERVAL DAYOFWEEK (NOW ()) - 1 DAY)
Xman Classical

7
ele retorna nos últimos 7 dias em vez da semana passada
kazuar

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

1
Isso não resolve a questão do OP se você executasse em '2011-05-22', você obteria id 15...
Cesar

2
Esta é a melhor resposta.
Jad Chahine

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

Eu uso a função YEARWEEK especificamente para voltar à semana anterior inteira do calendário (ao contrário de 7 dias antes de hoje). YEARWEEK também permite um segundo argumento que definirá o início da semana ou determinará como a primeira / última semana do ano será tratada. YEARWEEK permite que você mantenha o número de semanas para retroceder / avançar em uma única variável e não incluirá o mesmo número de semanas de anos anteriores / futuros, e é muito mais curto do que a maioria das outras respostas aqui.


2
Pelo que posso dizer, esta é a única resposta que realmente responde à pergunta dos OPs corretamente. A questão era como obter os registros da semana anterior . Muitas das respostas aqui estão realmente incorretas.
squarewav

Se você quiser especificar o dia de início da semana também, forneça o segundo argumento para YEARWEEK (): WHERE YEARWEEK(dateColumnFromTbl, 1) = YEARWEEK(CURDATE() - INTERVAL 1 WEEK, 1)
stamster

13

Forma simplificada:

Dados da semana passada:

SELECT id FROM tbl


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

Dados de 2 semanas atrás:

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


O que acontece na primeira semana do ano?
Christian Goetze

1
A questão era selecionar dados da semana passada? Se a primeira semana do ano e você quiser selecionar os dados da semana anterior, a consulta retornará a última semana do ano anterior.
Anam

4
Estou apenas confuso com o ANO (data) = ANO (data_atual) então. Como isso pode selecionar o ano anterior?
Christian Goetze

8

Você pode fazer seu cálculo em php e depois adicioná-lo à sua consulta:

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

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

agora isso vai dar a data de uma semana atrás


5

Provavelmente, a maneira mais simples seria:

SELECT id
FROM table
WHERE date >= current_date - 7

Por 8 dias (ou seja, de segunda a segunda)


3

POR FAVOR pessoal ... 'Semana passada' como o OP perguntou e onde eu estava procurando (mas não encontrei nenhuma resposta satisfatória) é NA ÚLTIMA SEMANA.

Se hoje é terça-feira, a ÚLTIMA SEMANA é segunda-feira UMA SEMANA ATRÁS a Domingo UMA SEMANA ATRÁS .

Assim:

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

Ou por semanas ISO:

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

2

Você precisará calcular qual dia relativo a hoje é domingo em seu middleware (php, python, etc.) *

Então,

select id
from table
where date >= "$sunday-date" + interval 7 DAY
  • pode ser uma maneira de obter a data de domingo em relação a hoje no MySQL também; essa seria, sem dúvida, a solução mais limpa, se não fosse muito cara para executar

2

Pode estar em uma única linha:

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

2

Uma maneira simples pode ser esta, este é um exemplo real do meu código e funciona perfeitamente:

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

1

A consulta acima não funcionará. Após a wherecláusula, se não conseguirmos CASTo valor da coluna, então não funcionará. Você devecast o valor da coluna.

por exemplo:

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
Explique por que seu código responde à pergunta do autor da pergunta.
Josh Burgess

0

Costumo fazer uma verificação rápida da "semana passada" também e o que se segue tende a funcionar bem para mim e inclui o dia de hoje.

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 você deseja que NÃO inclua o dia de hoje, basta subtrair um dia extra de @EndDate. Se eu selecionar essas duas variáveis ​​hoje, obter

@StartDate 2015-11-16 16: 34: 05.347 / * Segunda-feira passada * /

@EndDate 2015-11-23 16: 34: 05.347 / * Segunda-feira * /

Se eu quisesse de domingo a domingo, teria o seguinte.

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



0

Você também pode usar de maneira esay

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

0

i Use isto para a semana a partir de DOMINGO:

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


0

Aqui está uma maneira de obter os registros da última semana, mês e ano no MySQL.

Semana Anterior

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

Mês passado

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

Ano passado

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

0

Se você deseja recuperar registros nos últimos 7 dias, pode usar o snippet abaixo:

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

-1

Experimente isto:

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 você já sabe as datas, pode simplesmente usar entre, como este:

SELECT id    
FROM `Mytable`    
where MyDate BETWEEN "2011-05-15" AND "2011-05-21"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.