Truy vấn MySQL để chọn dữ liệu từ tuần trước?


96

Xin chào, tôi có một bảng với trường ngày tháng và một số thông tin khác. Tôi muốn chọn tất cả các mục từ tuần trước, (tuần bắt đầu từ Chủ nhật).

giá trị bảng:

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

Tôi muốn chọn tất cả các id từ tuần trước, đầu ra dự kiến ​​là 5, 6, 8. (id 2 không có trong tuần trước và id 15 là trong tuần hiện tại.)

Cách viết và Truy vấn SQL giống nhau.


Vì vậy, chỉ để làm rõ, bạn muốn dữ liệu kể từ chủ nhật, không nhất thiết phải là dữ liệu 7 ngày? Vì vậy, nếu hôm nay là thứ Hai, bạn sẽ nhận được 2 ngày dữ liệu (Chủ nhật và thứ Hai)?
Brendan Long

Chủ nhật đến thứ bảy. Không phải 7 ngày qua
coderex

Tôi không cảm thấy thực sự muốn chuyển đổi nó sang SQL ngay bây giờ, nhưng bạn có thể tìm thấy một thuật toán để xác định ngày trong tuần trên Wikipedia, và sau đó sử dụng thuật toán đó để quyết định xem nên xem lại bao xa: en.wikipedia.org/wiki/ …
Brendan Long

@Brendan Long: anh ấy có thể sử dụng SELECT id FROM tbl WHERE WEEK(date, 0) = WEEK(NOW(), 0) - 1trong nhiều tuần, nhưng tôi đoán mục tiêu của anh ấy không phải là các tuần theo lịch thực. Ít nhất thì anh ấy đã không đề cập đến các s / t như ISO-8601, hoặc liệu anh ấy có muốn thời điểm chuyển giao của năm được xem xét hay không.
Jürgen Thelen

Đối với tôi câu trả lời làWHERE table.column >= DATE(NOW()) - INTERVAL 7 DAY
Connor Leech

Câu trả lời:


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

1
Xin chào, Làm thế nào để có được tuần trước với tuần được xác định bắt đầu từ Thứ Hai đến Chủ Nhật
Xman Classical

5
@Graph Có, Tập lệnh SQL ở trên sẽ như thế: CHỌN id TỪ tbl WHERE DATE> DATE_SUB (DATE (NOW ()), INTERVAL DAYOFWEEK (NOW ()) + 6 DAY) VÀ DATE <= DATE_SUB (DATE (NOW ( )), INTERVAL DAYOFWEEK (NOW ()) - 1 NGÀY)
Xman Classical

7
nó quay trở lại 7 ngày trước thay vì tuần trước
kazuar 27/10/16

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

1
Điều này không giải quyết được câu hỏi OP nếu bạn chạy điều này vào '2011/05/22', bạn sẽ nhận được id 15...
Cesar

2
Đây là câu trả lời tốt nhất.
Jad Chahine

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

Tôi sử dụng đặc biệt hàm YEARWEEK để quay lại cả tuần trước theo lịch (thay vì 7 ngày trước hôm nay). YEARWEEK cũng cho phép một đối số thứ hai sẽ thiết lập ngày bắt đầu của tuần hoặc xác định cách xử lý tuần đầu tiên / tuần cuối cùng của năm. YEARWEEK cho phép bạn giữ số tuần quay lại / chuyển tiếp trong một biến duy nhất và sẽ không bao gồm số tuần tương tự từ những năm trước / tương lai và nó ngắn hơn nhiều so với hầu hết các câu trả lời khác ở đây.


2
Gần như tôi có thể nói, đây là câu trả lời duy nhất thực sự trả lời chính xác câu hỏi OP. Câu hỏi đặt ra là làm thế nào để có được hồ sơ từ tuần trước . Nhiều câu trả lời ở đây thực sự không chính xác.
squarewav

Nếu bạn muốn chỉ định ngày đầu tuần là tốt, cung cấp luận cứ 2 đến nămTuần (): WHERE YEARWEEK(dateColumnFromTbl, 1) = YEARWEEK(CURDATE() - INTERVAL 1 WEEK, 1)
stamster

13

Đơn giản hóa:

Dữ liệu tuần trước:

SELECT id FROM tbl


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

Dữ liệu 2 tuần trước:

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


Điều gì xảy ra trong tuần đầu tiên của năm?
Christian Goetze

1
Câu hỏi đặt ra là chọn dữ liệu từ tuần trước? Nếu tuần đầu tiên của năm và bạn muốn chọn dữ liệu tuần trước, truy vấn sẽ trả về tuần trước của năm trước.
Anam 09/1213

4
Tôi chỉ bối rối bởi YEAR (ngày) = YEAR (current_date) sau đó. Làm thế nào mà có thể chọn năm trước?
Christian Goetze

8

Bạn có thể thực hiện phép tính của mình bằng php và sau đó thêm nó vào truy vấn của mình:

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

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

bây giờ cái này sẽ cho ngày tháng trước


5

Có lẽ cách đơn giản nhất sẽ là:

SELECT id
FROM table
WHERE date >= current_date - 7

Trong 8 ngày (tức là Thứ Hai - Thứ Hai)


3

XIN mọi người ... 'Tuần trước' như OP đã hỏi và nơi tôi đang tìm kiếm (nhưng không tìm thấy câu trả lời nào thỏa mãn) là CUỐI TUẦN.

Nếu hôm nay là Thứ Ba, thì CUỐI TUẦN sẽ là Thứ Hai MỘT TUẦN SAU đến Chủ Nhật MỘT TUẦN .

Vì thế:

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

Hoặc cho các tuần ISO:

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

2

Bạn sẽ cần xác định ngày liên quan đến hôm nay là Chủ nhật trong phần mềm trung gian của bạn (php, python, v.v.) *

Sau đó,

select id
from table
where date >= "$sunday-date" + interval 7 DAY
  • cũng có thể là một cách để lấy ngày của chủ nhật so với ngày hôm nay trong MySQL; đó sẽ được cho là giải pháp sạch hơn nếu không quá đắt để thực hiện

2

Nó có thể nằm trong một dòng:

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

2

Một cách đơn giản có thể là cách này, đây là một ví dụ thực tế từ mã của tôi và hoạt động hoàn hảo:

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

1

Truy vấn trên sẽ không hoạt động. Sau wheremệnh đề, nếu chúng ta không thể CASTgiá trị cột, thì nó sẽ không hoạt động. Bạn nên castgiá trị cột.

ví dụ:

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
Vui lòng giải thích tại sao mã của bạn trả lời câu hỏi của người hỏi.
Josh Burgess

0

Tôi cũng thường kiểm tra nhanh "tuần trước" và những điều sau đây có xu hướng hoạt động tốt đối với tôi và bao gồm cả ngày hôm nay.

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 

Nếu bạn muốn điều này KHÔNG bao gồm ngày hôm nay, chỉ cần trừ thêm một ngày từ @EndDate. Nếu tôi chọn hai biến này ngày hôm nay nhận được

@StartDate 2015-11-16 16: 34: 05.347 / * Thứ Hai tuần trước * /

@EndDate 2015-11-23 16: 34: 05.347 / * Thứ Hai tuần này * /

Nếu tôi muốn từ Chủ nhật đến Chủ nhật, tôi sẽ có những thứ sau.

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

@StartDate 2015-11-15 16: 34: 05.347 / * Chủ nhật trước đó * /

@EndDate 2015-11-22 16: 34: 05.347 / * Chủ nhật tuần trước * /



0

Bạn cũng có thể sử dụng nó theo cách

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

0

Tôi sử dụng cái này cho tuần bắt đầu từ CHỦ NHẬT:

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


0

Đây là một cách để lấy các bản ghi tuần, tháng và năm trước trong MySQL.

Tuần trước

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

Tháng trước

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

Năm ngoái

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

0

Nếu bạn đang tìm cách truy xuất bản ghi trong vòng 7 ngày qua, bạn có thể sử dụng đoạn mã bên dưới:

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

-1

Thử cái này:

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

Nếu bạn đã biết ngày thì bạn có thể chỉ cần sử dụng giữa các ngày, như sau:

SELECT id    
FROM `Mytable`    
where MyDate BETWEEN "2011-05-15" AND "2011-05-21"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.