MySQL Query เพื่อเลือกข้อมูลจากสัปดาห์ที่แล้ว?


98

สวัสดีฉันมีตารางพร้อมฟิลด์วันที่และข้อมูลอื่น ๆ ฉันต้องการเลือกรายการทั้งหมดจากสัปดาห์ที่ผ่านมา (สัปดาห์เริ่มตั้งแต่วันอาทิตย์)

ค่าตาราง:

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

ฉันต้องการเลือกรหัสทั้งหมดจากสัปดาห์ที่แล้วผลลัพธ์ที่คาดหวังคือ 5, 6, 8 (รหัส 2 ไม่อยู่ในสัปดาห์ที่แล้วและรหัส 15 อยู่ในสัปดาห์ปัจจุบัน)

วิธีการเขียนและแบบสอบถาม SQL สำหรับสิ่งเดียวกัน


ดังนั้นเพื่อชี้แจงคุณต้องการข้อมูลตั้งแต่วันอาทิตย์ไม่จำเป็นต้องเป็นข้อมูล 7 วัน? ถ้าวันนี้เป็นวันจันทร์คุณจะได้รับข้อมูล 2 วัน (วันอาทิตย์และวันจันทร์)?
Brendan Long

วันอาทิตย์ถึงวันเสาร์ ไม่ใช่ 7 วันที่ผ่านมา
coderex

ฉันไม่รู้สึกอยากจะแปลงสิ่งนี้เป็น SQL ในตอนนี้ แต่คุณสามารถหาอัลกอริทึมเพื่อกำหนดวันในสัปดาห์บน Wikipedia จากนั้นใช้เพื่อตัดสินใจว่าจะมองย้อนกลับไปไกลแค่ไหน: en.wikipedia.org/wiki/ …
Brendan Long

@ เบรนแดนลอง: เขาสามารถSELECT id FROM tbl WHERE WEEK(date, 0) = WEEK(NOW(), 0) - 1ใช้ได้หลายสัปดาห์ แต่ฉันเดาว่าเป้าหมายของเขาไม่ใช่สัปดาห์จริง อย่างน้อยเขาก็ไม่ได้พูดถึง s / t เช่น ISO-8601 หรือว่าเขาต้องการให้คำนึงถึงช่วงเปลี่ยนปี
Jürgen Thelen

สำหรับฉันคำตอบคือWHERE table.column >= DATE(NOW()) - INTERVAL 7 DAY
Connor Leech

คำตอบ:


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

1
สวัสดีสัปดาห์ที่แล้วกับสัปดาห์ที่กำหนดเริ่มตั้งแต่วันจันทร์ถึงวันอาทิตย์
Xman Classical

5
@ กราฟใช่สคริปต์ SQL ด้านบนจะเป็นเช่นนั้น: SELECT id FROM tbl WHERE DATE> DATE_SUB (DATE (NOW ()), INTERVAL DAYOFWEEK (NOW ()) + 6 DAY) และ DATE <= DATE_SUB (DATE (NOW ( )), INTERVAL DAYOFWEEK (NOW ()) - 1 DAY)
Xman Classical

7
ส่งคืน 7 วันที่ผ่านมาแทนที่จะเป็นสัปดาห์ที่แล้ว
kazuar

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

1
สิ่งนี้ไม่ได้ช่วยแก้ปัญหา OP หากคุณใช้สิ่งนี้ใน '2011-05-22' คุณจะได้รับid 15...
Cesar

2
นี่คือคำตอบที่ดีที่สุด
Jad Chahine

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

ฉันใช้ฟังก์ชัน YEARWEEK โดยเฉพาะเพื่อย้อนกลับไปที่ปฏิทินทั้งสัปดาห์ก่อนหน้านี้ (ตรงข้ามกับ 7 วันก่อนหน้าวันนี้) YEARWEEK ยังอนุญาตอาร์กิวเมนต์ที่สองซึ่งจะกำหนดการเริ่มต้นของสัปดาห์หรือกำหนดวิธีจัดการสัปดาห์แรก / สัปดาห์สุดท้ายของปี YEARWEEK ช่วยให้คุณสามารถรักษาจำนวนสัปดาห์ที่จะย้อนกลับ / ไปข้างหน้าในตัวแปรเดียวและจะไม่รวมหมายเลขสัปดาห์เดียวกันจากปีก่อนหน้า / ในอนาคตและจะสั้นกว่าคำตอบอื่น ๆ ส่วนใหญ่ที่นี่


2
ใกล้อย่างที่บอกนี่เป็นคำตอบเดียวที่ตอบคำถาม OPs ได้อย่างถูกต้อง คำถามคือวิธีการที่จะได้รับการบันทึกจากสัปดาห์ก่อนหน้า หลายคำตอบที่นี่ไม่ถูกต้อง
squarewav

หากคุณต้องการระบุวันเริ่มต้นของสัปดาห์ด้วยให้ใส่อาร์กิวเมนต์ที่ 2 ให้กับ YEARWEEK (): WHERE YEARWEEK(dateColumnFromTbl, 1) = YEARWEEK(CURDATE() - INTERVAL 1 WEEK, 1)
stamster

ถ้าฉันต้องการรวมวันที่ของวันนี้ด้วย ... ภายในสัปดาห์ที่แล้ว ... เป็นอย่างไรบ้าง?
gumuruh

13

รูปแบบง่าย:

ข้อมูลสัปดาห์ที่แล้ว:

SELECT id FROM tbl


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

2 สัปดาห์ที่ผ่านมาข้อมูล:

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


จะเกิดอะไรขึ้นในสัปดาห์แรกของปี
Christian Goetze

1
คำถามคือการเลือกข้อมูลจากสัปดาห์ที่แล้ว? หากสัปดาห์แรกของปีและคุณต้องการเลือกข้อมูลสัปดาห์ที่แล้วข้อความค้นหาจะกลับมาในสัปดาห์สุดท้ายของปีก่อนหน้า
Anam

4
ฉันสับสนกับ YEAR (วันที่) = YEAR (วันที่ปัจจุบัน) จะเลือกปีที่แล้วได้อย่างไร?
Christian Goetze

8

คุณสามารถคำนวณใน php แล้วเพิ่มในแบบสอบถามของคุณ:

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

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

ตอนนี้จะให้วันที่สำหรับสัปดาห์ที่แล้ว



4

ขอความกรุณาผู้คน ... 'สัปดาห์ที่แล้ว' เช่น OP ถามและที่ฉันกำลังมองหา (แต่ไม่พบคำตอบที่น่าพอใจ) คือสัปดาห์สุดท้าย

หากวันนี้เป็นวันอังคารสัปดาห์สุดท้ายคือวันจันทร์สัปดาห์ที่แล้วถึงวันอาทิตย์สัปดาห์ที่แล้ว

ดังนั้น:

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

หรือสำหรับสัปดาห์ ISO:

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

2

คุณจะต้องคำนวณว่าวันใดที่สัมพันธ์กับวันนี้เป็นวันอาทิตย์ในมิดเดิลแวร์ของคุณ (php, python ฯลฯ ) *

จากนั้น

select id
from table
where date >= "$sunday-date" + interval 7 DAY
  • อาจเป็นวิธีรับวันอาทิตย์เทียบกับวันนี้ใน MySQL เช่นกัน นั่นอาจเป็นวิธีการแก้ปัญหาที่สะอาดกว่าหากไม่แพงเกินไปสำหรับการดำเนินการ


2

วิธีง่ายๆอาจเป็นวิธีนี้นี่เป็นตัวอย่างจริงจากโค้ดของฉันและทำงานได้อย่างสมบูรณ์:

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

1

แบบสอบถามข้างต้นจะไม่ทำงาน หลังจากwhereประโยคถ้าเราไม่สามารถCASTหาค่าคอลัมน์ได้ก็จะไม่ทำงาน คุณควรcastค่าคอลัมน์

เช่น:

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

1

ตัวอย่างเพิ่มเติมเช่นเดือนที่แล้วปีที่แล้ว 15 วันล่าสุด 3 เดือนที่ผ่านมา

ดึงบันทึกสัปดาห์ล่าสุด

ใช้แบบสอบถาม MySQL ด้านล่างเพื่อดึงข้อมูลสัปดาห์ที่แล้วจากตารางฐานข้อมูล mysql

SELECT name, created_at 
FROM employees
WHERE
YEARWEEK(`created_at`, 1) = YEARWEEK( CURDATE() - INTERVAL 1 WEEK, 1)

1

นี่คือวิธีรับบันทึกสัปดาห์เดือนและปีที่แล้วใน MySQL

อาทิตย์ที่แล้ว

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

เดือนที่แล้ว

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

ปีที่แล้ว

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

1

หากคุณต้องการดึงข้อมูลในช่วง 7 วันที่ผ่านมาคุณสามารถใช้ข้อมูลโค้ดด้านล่าง:

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
โปรดอธิบายว่าเหตุใดรหัสของคุณจึงตอบคำถามของผู้ถาม
Josh Burgess

0

ฉันมักจะตรวจสอบ "สัปดาห์ที่แล้ว" อย่างรวดเร็วเช่นกันและต่อไปนี้มีแนวโน้มที่จะใช้ได้ผลสำหรับฉันและรวมถึงวันนี้

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 

หากคุณไม่ต้องการให้วันนี้รวมวันนี้ให้ลบวันพิเศษออกจาก @EndDate ถ้าฉันเลือกสองตัวแปรวันนี้จะได้รับ

@StartDate 2015-11-16 16: 34: 05.347 / * วันจันทร์ที่ผ่านมา * /

@EndDate 2015-11-23 16: 34: 05.347 / * จันทร์นี้ * /

ถ้าฉันต้องการวันอาทิตย์ถึงวันอาทิตย์ฉันจะมีสิ่งต่อไปนี้

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

@StartDate 2015-11-15 16: 34: 05.347 / * วันอาทิตย์ก่อนหน้า * /

@EndDate 2015-11-22 16: 34: 05.347 / * วันอาทิตย์ที่ผ่านมา * /



0

คุณยังสามารถใช้มันได้อีกด้วย

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

0

ฉันใช้สิ่งนี้สำหรับสัปดาห์เริ่มตั้งแต่วันอาทิตย์:

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

-1

ลองสิ่งนี้:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.