Truy vấn MySQL - Bản ghi từ hôm nay đến 30 ngày trước


122

Tôi muốn trả lại tất cả các bản ghi đã được thêm vào cơ sở dữ liệu trong vòng 30 ngày qua. Tôi cần chuyển đổi ngày thành mm / dd / yy vì mục đích hiển thị.

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

Tuyên bố của tôi không giới hạn các bản ghi trong 30 ngày qua - nó chọn tất cả các bản ghi.

ai đó có thể chỉ cho tôi phương hướng đúng không? Cảm giác như mình đang ở gần.

Cảm ơn và chúc bạn một tuần tốt lành.

Câu trả lời:


292

Bạn cần áp dụng DATE_FORMATtrong SELECTmệnh đề, không phải WHEREmệnh đề:

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

Cũng lưu ý rằng CURDATE()chỉ trả về một DATEphần của ngày, vì vậy nếu bạn lưu trữ create_datedưới dạng một DATETIMEvới phần thời gian được lấp đầy, truy vấn này sẽ không chọn các bản ghi của ngày hôm nay.

Trong trường hợp này, bạn sẽ cần sử dụng NOW:

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

Phần thứ hai của câu trả lời này là rất quan trọng! Tôi có thể có hoặc không có vấn đề đó và tôi đã vò đầu bứt tai cho đến khi tôi quay lại câu trả lời này.
Tyler Lazenby

@Quassnoi Tôi xin lỗi. Đây dường như chỉ là vấn đề chuẩn bị của WordPress \ wpdb. Xin lỗi lần nữa.
vee

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

2
Tôi thích phương pháp này hơn BETWEEN CURDATE () - INTERVAL 30
Dan

1
@ErmSo tôi có thể biết tại sao không?
slim

3
Tôi sẽ không nói dối - đó là 2 năm trước và tôi không thể nhớ! Xin lỗi: P
Dan

1
Không cần sử dụngDATE_FORMAT(create_date, '%m/%d/%Y')
kazy

@ Tôi muốn làm cho nó dễ đọc hơn bằng cách đặt ngày trước đó trong ngoặc đơn: ... WHERE create_date BETWEEN (NOW() - INTERVAL 30 DAY) AND NOW()
Kris Craig

10

DATE_FORMATtrả về một chuỗi, vì vậy bạn đang sử dụng hai chuỗi trong BETWEENmệnh đề của mình , điều này sẽ không hoạt động như bạn mong đợi.

Thay vào đó, hãy chuyển đổi ngày sang định dạng của bạn trong SELECTvà thực hiện BETWEENđối với các ngày thực tế. Ví dụ,

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

Bạn cũng có thể viết điều này trong mysql -

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

ĐÃ SỬA


2
Hãy coi chừng: bất chấp sự lên-phiếu, này sẽ chọn ngày tháng trong kế tiếp 30 ngày / tháng, không phải là cuối cùng 30 ngày!
JonBrave

4
Đồng ý, phải là WHERE create_date> DATE_ADD (NOW (), INTERVAL -1 THÁNG);
Bhavik P.

6

Đối với hoạt động của ngày hiện tại và hoạt động hoàn chỉnh trong 30 ngày trước đó, hãy sử dụng tùy chọn này, vì SYSDATE có thể thay đổi trong một ngày nên ngày 30 trước đó sẽ không có toàn bộ dữ liệu cho ngày đó.

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

1

Đây là một giải pháp mà không cần sử dụng curdate()chức năng, đây là một giải pháp cho những người sử dụng TSQLtôi đoán

SELECT myDate
FROM myTable
WHERE myDate BETWEEN DATEADD(DAY, -30, GETDATE()) AND GETDATE()
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.