MySQL Query - บันทึกระหว่างวันนี้ถึง 30 วันที่ผ่านมา


122

ฉันต้องการส่งคืนระเบียนทั้งหมดที่เพิ่มลงในฐานข้อมูลภายใน 30 วันที่ผ่านมา ฉันต้องการแปลงวันที่เป็น mm / dd / yy เนื่องจากวัตถุประสงค์ในการแสดงผล

create_date between DATE_FORMAT(curdate(),'%m/%d/%Y') AND (DATE_FORMAT(curdate() - interval 30 day,'%m/%d/%Y')) 

คำสั่งของฉันล้มเหลวในการ จำกัด บันทึกในช่วง 30 วันที่ผ่านมา - มันเลือกบันทึกทั้งหมด

ใครช่วยชี้ทางที่ถูกต้องให้ฉันได้ไหม รู้สึกเหมือนอยู่ใกล้ ๆ

ขอขอบคุณและมีสัปดาห์ที่ดี

คำตอบ:


293

คุณต้องใช้DATE_FORMATในส่วนSELECTคำสั่งไม่ใช่WHEREประโยค:

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE()

นอกจากนี้โปรดทราบว่าCURDATE()ส่งคืนเฉพาะDATEส่วนของวันที่ดังนั้นหากคุณจัดเก็บcreate_dateเป็นส่วนที่DATETIMEมีการเติมส่วนเวลาแบบสอบถามนี้จะไม่เลือกระเบียนของวันนี้

ในกรณีนี้คุณจะต้องใช้NOWแทน:

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date BETWEEN NOW() - INTERVAL 30 DAY AND NOW()

ส่วนที่สองของคำตอบนี้สำคัญมาก! ฉันอาจมีหรือไม่มีปัญหานั้นและฉันก็เกาหัวของฉันจนกว่าฉันจะกลับมาที่คำตอบนี้
Tyler Lazen โดย

@Quassnoi ฉันขอโทษ ดูเหมือนว่าจะเป็น WordPress \ wpdb เตรียมปัญหาเท่านั้น ขอโทษอีกครั้ง.
vee

56
SELECT
    *
FROM
    < table_name >
WHERE
    < date_field > BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY)
AND NOW();

2
ฉันชอบวิธีนี้มากกว่าระหว่าง CURDATE () - INTERVAL 30
Dan

1
@ErmSo ฉันจะรู้ว่าทำไม?
ผอม

3
ฉันจะไม่โกหก - เมื่อ 2 ปีก่อนและฉันจำไม่ได้! ขออภัย: P
Dan

1
ไม่ต้องใช้DATE_FORMAT(create_date, '%m/%d/%Y')
kazy

@Dan ฉันต้องการให้อ่านได้มากขึ้นโดยใส่วันที่ก่อนหน้าในวงเล็บ: ... WHERE create_date BETWEEN (NOW() - INTERVAL 30 DAY) AND NOW()
Kris Craig

10

DATE_FORMAT ส่งคืนสตริงดังนั้นคุณกำลังใช้สองสตริงในไฟล์ BETWEENอนุประโยคซึ่งจะไม่ได้ผลตามที่คุณคาดหวัง

ให้แปลงวันที่เป็นรูปแบบของคุณในรูปแบบSELECTและทำBETWEENวันที่จริงแทน ตัวอย่างเช่น,

SELECT DATE_FORMAT(create_date, '%m/%d/%y') as create_date_formatted
FROM table
WHERE create_date BETWEEN (CURDATE() - INTERVAL 30 DAY) AND CURDATE()

9

คุณสามารถเขียนสิ่งนี้ใน mysql -

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date < DATE_ADD(NOW(), INTERVAL -1 MONTH);

แก้ไขแล้ว


2
ระวัง: แม้จะมีการขึ้นเสียงนี้วันที่เลือกในถัดไป 30 วัน / เดือนไม่ได้ผ่านมา 30 วัน!
JonBrave

4
ตกลงควรเป็น WHERE create_date> DATE_ADD (NOW (), INTERVAL -1 MONTH);
ภวิค

6

สำหรับกิจกรรมวันที่ปัจจุบันและกิจกรรมที่สมบูรณ์สำหรับ 30 วันก่อนหน้าให้ใช้สิ่งนี้เนื่องจาก SYSDATE เป็นตัวแปรในหนึ่งวันวันที่ 30 ก่อนหน้าจะไม่มีข้อมูลทั้งหมดสำหรับวันนั้น

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM mytable
WHERE create_date BETWEEN CURDATE() - INTERVAL 30 DAY AND SYSDATE()

1

นี่เป็นวิธีแก้ปัญหาโดยไม่ต้องใช้curdate()ฟังก์ชันนี่เป็นวิธีแก้ปัญหาสำหรับผู้ที่ใช้TSQLฉันเดา

SELECT myDate
FROM myTable
WHERE myDate BETWEEN DATEADD(DAY, -30, GETDATE()) AND GETDATE()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.