Requête MySQL pour sélectionner les données de la semaine dernière?

96

Salut j'ai une table avec un champ de date et quelques autres informations. Je souhaite sélectionner toutes les entrées de la semaine dernière (début de la semaine dimanche).

valeurs de table:

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

Je veux sélectionner tous les identifiants de la semaine dernière, la sortie attendue est 5, 6, 8. (l'identifiant 2 n'est pas dans la semaine dernière et l'identifiant 15 est dans la semaine en cours.)

Comment écrire et requête SQL pour le même.

coderex
la source
Donc juste pour clarifier, vous voulez des données depuis dimanche, pas forcément 7 jours de données? Donc, si aujourd'hui est lundi, vous aurez 2 jours de données (dimanche et lundi)?
Brendan Long
Du dimanche au samedi. Pas les 7 derniers jours
coderex
Je n'ai pas envie de convertir cela en SQL pour le moment, mais vous pouvez trouver un algorithme pour déterminer le jour de la semaine sur Wikipedia, puis l'utiliser pour décider de la distance à parcourir: en.wikipedia.org/wiki/ …
Brendan Long
@Brendan Long: il pourrait l'utiliser SELECT id FROM tbl WHERE WEEK(date, 0) = WEEK(NOW(), 0) - 1pendant des semaines, mais je suppose que son objectif n'est pas de vraies semaines calendaires. Au moins, il n'a pas mentionné s / t comme ISO-8601, ou s'il veut que le tournant de l'année soit pris en considération.
Jürgen Thelen
Pour moi, la réponse estWHERE table.column >= DATE(NOW()) - INTERVAL 7 DAY
Connor Leech

Réponses:

123
SELECT id FROM tbl
WHERE date >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY
AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY
piotrme
la source
1
Bonjour, Comment obtenir la semaine dernière avec un début de semaine défini du lundi au dimanche
Xman Classical
5
@Graph Oui, le script SQL ci-dessus sera comme ça: 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
il revient les 7 derniers jours au lieu de la semaine dernière
kazuar
134
select id from tbname
where date between date_sub(now(),INTERVAL 1 WEEK) and now();
Vishwanath Dalvi
la source
1
Cela ne résout pas la question de l'OP si vous exécutiez ceci le '2011-05-22', vous obtiendriez id 15...
Cesar
2
C'est la meilleure réponse.
Jad Chahine
21
SELECT id FROM table1
WHERE YEARWEEK(date) = YEARWEEK(NOW() - INTERVAL 1 WEEK)

J'utilise la fonction YEARWEEK spécifiquement pour revenir à la semaine civile précédente (par opposition à 7 jours avant aujourd'hui). YEARWEEK autorise également un deuxième argument qui définira le début de la semaine ou déterminera comment la première / dernière semaine de l'année est gérée. YEARWEEK vous permet de conserver le nombre de semaines pour revenir / avancer dans une seule variable, et n'inclura pas le même numéro de semaine des années précédentes / futures, et c'est beaucoup plus court que la plupart des autres réponses ici.

confiance dans le temps
la source
2
Autant que je sache, c'est la seule réponse qui répond correctement à la question des OP. La question était de savoir comment obtenir les enregistrements de la semaine précédente . Beaucoup de réponses ici sont en fait incorrectes.
squarewav
Si vous souhaitez également spécifier le jour de début de la semaine, fournissez le deuxième argument à YEARWEEK (): WHERE YEARWEEK(dateColumnFromTbl, 1) = YEARWEEK(CURDATE() - INTERVAL 1 WEEK, 1)
stamster
13

Forme simplifiée:

Données de la semaine dernière:

SELECT id FROM tbl


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

Il y a 2 semaines données:

SELECT id FROM tbl


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

Violon SQL

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

Anam
la source
Que se passe-t-il la première semaine de l'année?
Christian Goetze
1
La question était de sélectionner les données de la semaine dernière? Si la première semaine de l'année et que vous souhaitez sélectionner les données de la semaine dernière, la requête renverra la dernière semaine de l'année précédente.
Anam
4
Je suis juste confus par YEAR (date) = YEAR (current_date) alors. Comment cela peut-il sélectionner l'année précédente?
Christian Goetze
8

Vous pouvez faire votre calcul en php puis l'ajouter à votre requête:

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

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

maintenant cela donnera la date d'il y a une semaine

Ibu
la source
5

Le moyen le plus simple serait probablement:

SELECT id
FROM table
WHERE date >= current_date - 7

Pendant 8 jours (c'est-à-dire du lundi au lundi)

inutile
la source
3

S'IL VOUS PLAÎT les gens ... «La semaine dernière» comme le PO m'a demandé et où je cherchais (mais je n'ai trouvé aucune réponse satisfaisante) est LA SEMAINE DERNIÈRE.

Si aujourd'hui est mardi, alors la SEMAINE DERNIÈRE est du lundi IL Y A UNE SEMAINE au dimanche IL Y A UNE SEMAINE .

Alors:

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

Ou pour les semaines ISO:

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

Vous devrez calculer quel jour par rapport à aujourd'hui est dimanche dans votre middleware (php, python, etc.) *

Ensuite,

select id
from table
where date >= "$sunday-date" + interval 7 DAY
  • peut être un moyen d'obtenir la date de dimanche par rapport à aujourd'hui dans MySQL également; ce serait sans doute la solution la plus propre sinon trop coûteuse à réaliser
virtuale oui
la source
2

Cela peut être sur une seule ligne:

SELECT * FROM table WHERE Date BETWEEN (NOW() - INTERVAL 7 DAY) AND NOW()
Abhinav Bhardwaj
la source
2

Un moyen simple peut être celui-ci, c'est un vrai exemple de mon code et fonctionne parfaitement:

where("actions.created_at >= DATE_SUB(CURDATE(), INTERVAL 1 WEEK)")
Javier Rodriguez Ortiz
la source
1

La requête ci-dessus ne fonctionnera pas. Après la whereclause, si nous ne pouvons pas CASTla valeur de la colonne, cela ne fonctionnera pas. Vous devriez castla valeur de la colonne.

par exemple:

SELECT.....
WHERE CAST( yourDateColumn AS DATE ) > DATEADD( DAY, -7, CAST( GETDATE() AS DATE )
user7821340
la source
0
SELECT id  FROM tb1
WHERE 
YEARWEEK (date) = YEARWEEK( current_date -interval 1 week ) 
Manoj
la source
1
Veuillez expliquer pourquoi votre code répond à la question du demandeur.
Josh Burgess
0

Je fais souvent une vérification rapide de la «semaine dernière» aussi et ce qui suit a tendance à bien fonctionner pour moi et comprend aujourd'hui.

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 vous voulez que cela ne soit PAS inclus aujourd'hui, soustrayez simplement un jour supplémentaire de @EndDate. Si je sélectionne ces deux variables aujourd'hui, obtenez

@StartDate 2015-11-16 16: 34: 05.347 / * Lundi dernier * /

@EndDate 2015-11-23 16: 34: 05.347 / * Ce lundi * /

Si je voulais du dimanche au dimanche, j'aurais ce qui suit.

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

@StartDate 2015-11-15 16: 34: 05.347 / * Dimanche précédent * /

@EndDate 2015-11-22 16: 34: 05.347 / * Dimanche dernier * /

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

Vous pouvez également l'utiliser de manière simple

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

i Utilisez ceci pour la semaine commençant le DIMANCHE:

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

Voici un moyen d'obtenir les enregistrements de la semaine, du mois et de l'année dernière dans MySQL.

La semaine dernière

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

Le mois dernier

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

L'année dernière

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

Si vous souhaitez récupérer des enregistrements au cours des 7 derniers jours, vous pouvez utiliser l'extrait ci-dessous:

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

Essaye ça:

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
la source
-5

Si vous connaissez déjà les dates, vous pouvez simplement utiliser entre, comme ceci:

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