Geçen haftadan veri seçmek için MySQL Sorgusu?


98

Merhaba, bir tarih alanı ve başka bilgiler içeren bir tablom var. Geçen haftadaki tüm girişleri seçmek istiyorum (hafta başlangıcı Pazar).

tablo değerleri:

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

Geçen haftadaki tüm kimlikleri seçmek istiyorum, beklenen çıktı 5, 6, 8. (kimlik 2 geçen hafta değil ve kimlik 15 geçerli hafta içinde.)

Nasıl yazılır ve aynı SQL Sorgusu.


Yani açıklığa kavuşturmak için, pazar gününden beri 7 günlük veri olması gerekmiyor mu? Yani bugün Pazartesi ise 2 günlük veri (Pazar ve Pazartesi) alacaksınız?
Brendan Long

Pazar-Cumartesi. Son 7 gün değil
coderex

Şu anda bunu gerçekten SQL'e dönüştürmek istemiyorum, ancak Wikipedia'da haftanın gününü belirlemek için bir algoritma bulabilir ve daha sonra ne kadar geriye bakacağınıza karar vermek için bunu kullanabilirsiniz: en.wikipedia.org/wiki/ …
Brendan Long

@Brendan Long: SELECT id FROM tbl WHERE WEEK(date, 0) = WEEK(NOW(), 0) - 1Haftalarca kullanabilirdi ama sanırım hedefi gerçek takvim haftaları değil . En azından ISO-8601 gibi bir şeyden veya yılın dönüşünün dikkate alınmasını isteyip istemediğinden bahsetmedi.
Jürgen Thelen

Benim için cevapWHERE table.column >= DATE(NOW()) - INTERVAL 7 DAY
Connor Leech

Yanıtlar:


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

1
Merhaba, Geçen hafta Pazartesi'den Pazar'a tanımlanmış bir başlangıç ​​ile nasıl alınır
Xman Classical

5
@Graph Evet, yukarıdaki SQL betiği şu şekilde olacaktır: SELECT id from tbl WHERE DATE> DATE_SUB (DATE (NOW ()), INTERVAL DAYOFWEEK (NOW ()) + 6 DAY) AND DATE <= DATE_SUB (DATE (NOW (ŞİMDİ) ( )), ARALIK GÜNÜHAFTA (ŞİMDİ ()) - 1 GÜN)
Xman Klasik

7
geçen hafta yerine son 7 günü döndürür
kazuar

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

1
Bunu '2011-05-22'de çalıştırırsanız, bu OP sorusunu çözmez id 15...
Cesar

2
Bu en iyi cevap.
Jad Chahine

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

YEARWEEK işlevini özellikle önceki tüm takvim haftasına geri dönmek için kullanıyorum (bugünden önceki 7 gün yerine). YEARWEEK ayrıca haftanın başlangıcını belirleyecek veya yılın ilk / son haftasının nasıl işleneceğini belirleyecek ikinci bir argümana izin verir. YEARWEEK, tek bir değişkende geri / ileri gitmek için hafta sayısını tutmanıza izin verir ve önceki / gelecek yıllardan aynı hafta numarasını içermez ve buradaki diğer cevapların çoğundan çok daha kısadır.


2
Söyleyebileceğim kadarıyla, OP'lerin sorusunu doğru cevaplayan tek cevap bu. Soru, önceki haftadan kayıtların nasıl alınacağıydı . Buradaki cevapların çoğu aslında yanlış.
squarewav

Haftanın başlangıç ​​gününü de belirtmek istiyorsanız, 2. bağımsız değişkeni YEARWEEK () için sağlayın: WHERE YEARWEEK(dateColumnFromTbl, 1) = YEARWEEK(CURDATE() - INTERVAL 1 WEEK, 1)
stamster

Bugünün tarihini de eklemek istersem ... geçen haftaya ... bu nasıldı?
gumuruh

13

Basitleştirilmiş form:

Geçen hafta verileri:

SELECT id FROM tbl


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

2 hafta önce veriler:

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


Yılın ilk haftasında neler oluyor?
Christian Goetze

1
Soru, geçen haftanın verilerini seçmekti? Yılın ilk haftasıysa ve geçen haftanın verilerini seçmek istiyorsanız, sorgu önceki yılın son haftasını döndürür.
Anam

4
O zaman YEAR (tarih) = YEAR (geçerli_tarih) ile kafam karıştı. Bu bir önceki yılı nasıl seçebilir?
Christian Goetze

8

Hesaplamanızı php olarak yapabilir ve ardından sorgunuza ekleyebilirsiniz:

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

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

şimdi bu bir hafta öncesinin tarihini verecek


5

Muhtemelen en basit yol şudur:

SELECT id
FROM table
WHERE date >= current_date - 7

8 gün boyunca (yani Pazartesi - Pazartesi)


4

LÜTFEN insanlar ... OP'nin sorduğu ve aradığım yer (ancak cevapların hiçbirini tatmin edici bulamadığım) gibi 'Geçen hafta' SON HAFTA.

Bugün Salı ise, SON HAFTA Pazartesi A HAFTA ÖNCE ile Pazar arası BİR HAFTA ÖNCE'dir .

Yani:

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

Veya ISO haftaları için:

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

2

Ara yazılımınızda (php, python, vb.), Bugüne göre hangi günün Pazar olduğunu hesaplamanız gerekir *

Sonra,

select id
from table
where date >= "$sunday-date" + interval 7 DAY
  • MySQL'de de bugün ile pazarın tarihini almanın bir yolu olabilir; Bu, gerçekleştirmek için çok pahalı olmasa da tartışmasız daha temiz bir çözüm olacaktır.

2

Tek satırda olabilir:

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

2

Basit bir yol bu olabilir, bu benim kodumdan gerçek bir örnek ve mükemmel çalışıyor:

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

1

Yukarıdaki sorgu çalışmayacaktır. whereMaddeden sonra CASTsütun değerini alamazsak çalışmayacaktır. castSütun değerini almalısınız .

Örneğin:

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


1

İşte MySQL'de geçen hafta, ay ve yıl kayıtlarını almanın bir yolu.

Geçen hafta

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

Geçen ay

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

Geçen yıl

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

1

Son 7 gün içinde kayıtları geri almak istiyorsanız, aşağıdaki snippet'i kullanabilirsiniz:

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

0
SELECT id  FROM tb1
WHERE 
YEARWEEK (date) = YEARWEEK( current_date -interval 1 week ) 

1
Lütfen kodunuzun soruyu soran kişinin sorusunu neden yanıtladığını açıklayın.
Josh Burgess

0

Ben de sık sık hızlı bir "geçen hafta" kontrolü yaparım ve aşağıdakiler benim için iyi sonuç verir ve bugünü içerir.

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 

Bunun bugün dahil OLMAMASINI istiyorsanız, @EndDate'ten fazladan bir gün çıkarın. Bugün bu iki değişkeni seçersem

@StartDate 2015-11-16 16: 34: 05.347 / * Geçen Pazartesi * /

@EndDate 2015-11-23 16: 34: 05.347 / * Bu Pazartesi * /

Pazar gününden Pazar gününe kadar isteseydim aşağıdakilere sahip olurdum.

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

@StartDate 2015-11-15 16: 34: 05.347 / * Önceki Pazar * /

@EndDate 2015-11-22 16: 34: 05.347 / * Geçen Pazar * /



0

Ayrıca esay şekilde de kullanabilirsiniz

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

0

i Bunu PAZAR'dan itibaren başlayan hafta için kullanın:

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

-1

Bunu dene:

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

Tarihleri ​​zaten biliyorsanız, aşağıdaki gibi basitçe kullanabilirsiniz:

SELECT id    
FROM `Mytable`    
where MyDate BETWEEN "2011-05-15" AND "2011-05-21"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.