Zapytanie MySQL, aby wybrać dane z ostatniego tygodnia?

96

Cześć, mam tabelę z polem daty i kilkoma innymi informacjami. Chcę zaznaczyć wszystkie wpisy z ostatniego tygodnia (tydzień zaczyna się od niedzieli).

wartości w tabeli:

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

Chcę wybrać wszystkie identyfikatory z zeszłego tygodnia, oczekiwane dane wyjściowe to 5, 6, 8. (identyfikator 2 nie w zeszłym tygodniu, a identyfikator 15 w bieżącym tygodniu).

Jak pisać i zapytania SQL dla tego samego.

coderex
źródło
Aby wyjaśnić, potrzebujesz danych od niedzieli, niekoniecznie z 7 dni? Więc jeśli dzisiaj jest poniedziałek, otrzymasz dane z 2 dni (niedziela i poniedziałek)?
Brendan Long
Od niedzieli do soboty. Nie ostatnie 7 dni
coderex
Nie mam ochoty konwertować tego na SQL w tej chwili, ale możesz znaleźć algorytm do określenia dnia tygodnia na Wikipedii, a następnie użyć go, aby zdecydować, jak daleko zajrzeć: en.wikipedia.org/wiki/ …
Brendan Long
@Brendan Long: mógłby używać SELECT id FROM tbl WHERE WEEK(date, 0) = WEEK(NOW(), 0) - 1przez tygodnie, ale myślę, że jego celem nie są prawdziwe tygodnie kalendarzowe. Przynajmniej nie wspomniał o s / t, jak ISO-8601, ani o tym, czy chce, aby uwzględniono przełom roku.
Jürgen Thelen
Dla mnie odpowiedź brzmiWHERE table.column >= DATE(NOW()) - INTERVAL 7 DAY
Connor Leech

Odpowiedzi:

123
SELECT id FROM tbl
WHERE date >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY
AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY
piotrm
źródło
1
Cześć, Jak uzyskać ostatni tydzień z tygodniowym rozpoczęciem od poniedziałku do niedzieli
Xman Classical
5
@Graph Tak, powyższy skrypt SQL będzie wyglądał następująco: SELECT id FROM tbl WHERE DATE> DATE_SUB (DATE (NOW ()), INTERVAL DAYOFWEEK (NOW ()) + 6 DAY) AND DATE <= DATE_SUB (DATE (NOW ( )), INTERWAŁ DZIEŃ TYGODNIA (TERAZ ()) - 1 DZIEŃ)
Xman Classical
7
zwraca ostatnie 7 dni zamiast ostatniego tygodnia
kazuar
134
select id from tbname
where date between date_sub(now(),INTERVAL 1 WEEK) and now();
Vishwanath Dalvi
źródło
1
To nie rozwiązuje pytania OP, jeśli uruchomiłeś to w '2011-05-22', otrzymasz id 15...
Cesar
2
To najlepsza odpowiedź.
Jad Chahine
21
SELECT id FROM table1
WHERE YEARWEEK(date) = YEARWEEK(NOW() - INTERVAL 1 WEEK)

Używam funkcji YEARWEEK specjalnie, aby wrócić do poprzedniego całego tygodnia kalendarzowego (w przeciwieństwie do 7 dni przed dzisiejszym dniem). YEARWEEK pozwala również na drugi argument, który ustawi początek tygodnia lub określi, jak obsługiwany jest pierwszy / ostatni tydzień roku. YEARWEEK pozwala zachować liczbę tygodni, aby przejść wstecz / do przodu w jednej zmiennej i nie będzie zawierać tego samego numeru tygodnia z poprzednich / przyszłych lat i jest znacznie krótszy niż większość innych odpowiedzi tutaj.

zaufanie do czasu
źródło
2
O ile wiem, jest to jedyna odpowiedź, która właściwie odpowiada na pytanie PO. Pytanie brzmiało, jak zdobyć rekordy z poprzedniego tygodnia . Wiele odpowiedzi jest w rzeczywistości niepoprawnych.
squarewav
Jeśli chcesz również określić dzień rozpoczęcia tygodnia, podaj drugi argument do YEARWEEK (): WHERE YEARWEEK(dateColumnFromTbl, 1) = YEARWEEK(CURDATE() - INTERVAL 1 WEEK, 1)
stamster
13

Uproszczona forma:

Dane z ostatniego tygodnia:

SELECT id FROM tbl


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

Dane sprzed 2 tygodni:

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

Anam
źródło
Co dzieje się w pierwszym tygodniu roku?
Christian Goetze
1
Pytanie brzmiało, jak wybrać dane z zeszłego tygodnia? Jeśli pierwszy tydzień roku, a chcesz wybrać dane z ostatniego tygodnia, zapytanie zwróci ostatni tydzień poprzedniego roku.
Anam
4
Jestem po prostu zdezorientowany przez YEAR (date) = YEAR (current_date) wtedy. Jak można wybrać poprzedni rok?
Christian Goetze
8

Możesz wykonać obliczenia w PHP, a następnie dodać je do zapytania:

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

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

teraz podamy datę sprzed tygodnia

Ibu
źródło
5

Prawdopodobnie najprostszym sposobem byłoby:

SELECT id
FROM table
WHERE date >= current_date - 7

Przez 8 dni (tj. Od poniedziałku do poniedziałku)

bezużyteczny
źródło
3

PROSZĘ ludzie ... „Ostatni tydzień”, jak zapytał OP, a gdzie szukałem (ale nie znalazłem żadnej odpowiedzi satysfakcjonującej) to OSTATNI TYDZIEŃ.

Jeśli dzisiaj jest wtorek, OSTATNI TYDZIEŃ przypada w poniedziałek TYDZIEŃ TEMU do niedzieli TYDZIEŃ TEMU .

Więc:

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

Lub dla tygodni ISO:

WHERE
    WEEK(yourdate, 3) = WEEK(NOW(), 3) - 1
MS Berends
źródło
2

Musisz obliczyć, który dzień względem dzisiejszego jest niedzielą w twoim oprogramowaniu pośrednim (php, python itp.) *

Następnie,

select id
from table
where date >= "$sunday-date" + interval 7 DAY
  • może być sposobem na pobranie daty niedzieli w stosunku do dnia dzisiejszego również w MySQL; byłoby to prawdopodobnie czystszym rozwiązaniem, gdyby nie było zbyt drogie w wykonaniu
wirtualne oczy
źródło
2

Może znajdować się w jednej linii:

SELECT * FROM table WHERE Date BETWEEN (NOW() - INTERVAL 7 DAY) AND NOW()
Abhinav bhardwaj
źródło
2

Prostym sposobem może być ten, to jest prawdziwy przykład z mojego kodu i działa doskonale:

where("actions.created_at >= DATE_SUB(CURDATE(), INTERVAL 1 WEEK)")
Javier Rodriguez Ortiz
źródło
1

Powyższe zapytanie nie zadziała. Po whereklauzuli, jeśli nie możemy podać CASTwartości kolumny, to nie zadziała. Powinieneś castwartość kolumny.

na przykład:

SELECT.....
WHERE CAST( yourDateColumn AS DATE ) > DATEADD( DAY, -7, CAST( GETDATE() AS DATE )
user7821340
źródło
0
SELECT id  FROM tb1
WHERE 
YEARWEEK (date) = YEARWEEK( current_date -interval 1 week ) 
Manoj
źródło
1
Wyjaśnij, dlaczego Twój kod odpowiada na pytanie pytającego.
Josh Burgess,
0

Często robię również szybką kontrolę „z ostatniego tygodnia”, a poniższe zwykle działają dobrze i obejmują dzisiaj.

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 

Jeśli chcesz, aby NIE obejmowało to dnia dzisiejszego, po prostu odejmij dodatkowy dzień od @EndDate. Jeśli dzisiaj wybiorę te dwie zmienne, otrzymam

@StartDate 2015-11-16 16: 34: 05.347 / * Ostatni poniedziałek * /

@EndDate 2015-11-23 16: 34: 05.347 / * W poniedziałek * /

Gdybym chciał od niedzieli do niedzieli, miałbym co następuje.

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

@StartDate 2015-11-15 16: 34: 05.347 / * Poprzednia niedziela * /

@EndDate 2015-11-22 16: 34: 05.347 / * Ostatnia niedziela * /

Izulien
źródło
0
WHERE yourDateColumn > DATEADD(DAY, -7, GETDATE()) ;
Veera Induvasi
źródło
0

Możesz również użyć go na e-mail

SELECT *
FROM   inventory
WHERE  YEARWEEK(`modify`, 1) = YEARWEEK(CURDATE(), 1)
HAROONMIND
źródło
0

Używaj tego na tydzień rozpoczynający się od NIEDZIELI:

SELECT id FROM tbl
WHERE
date >= curdate() - INTERVAL DAYOFWEEK(curdate())+5 DAY  
AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-2 DAY
Hoàng Vũ Tgtt
źródło
0

Oto sposób na uzyskanie rekordów z ostatniego tygodnia, miesiąca i roku w MySQL.

Zeszły tydzień

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

W zeszłym miesiącu

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

Ostatni rok

SELECT UserName, InsertTime 
FROM tblaccounts
WHERE YEAR(InsertTime) = YEAR(NOW()) - 1;
M. Hamza Rajput
źródło
0

Jeśli chcesz odzyskać rekordy z ostatnich 7 dni, możesz skorzystać z poniższego fragmentu:

SELECT date FROM table_name WHERE DATE(date) >= CURDATE() - INTERVAL 7 DAY;
Simo Patrek
źródło
-1

Spróbuj tego:

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
źródło
-5

Jeśli znasz już daty, możesz po prostu użyć między, na przykład:

SELECT id    
FROM `Mytable`    
where MyDate BETWEEN "2011-05-15" AND "2011-05-21"
user765060
źródło