MySQL Sorgusu - Bugün ile Son 30 Gün Arasındaki Kayıtlar


122

Veritabanına son 30 gün içinde eklenen tüm kayıtları iade etmek istiyorum. Görüntüleme amaçları nedeniyle tarihi aa / gg / yy'ye dönüştürmem gerekiyor.

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

İfadem kayıtları son 30 günle sınırlayamıyor - tüm kayıtları seçiyor.

Biri beni doğru yöne yönlendirebilir mi? Sanki yakınmışım gibi geliyor.

Teşekkürler ve iyi haftalar.

Yanıtlar:


293

Sen uygulamak gerekir DATE_FORMATiçinde SELECTmaddesi değil, WHEREfıkra:

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

Ayrıca unutmayın CURDATE(), yalnızca döner DATEsaklamak eğer öyleyse, tarih kısmı create_datebir şekilde DATETIMEdoldurulmuş zaman bölümüyle bu sorgu bugünün kayıtları seçmek olmaz.

Bu durumda, NOWbunun yerine şunları kullanmanız gerekir :

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

Bu cevabın ikinci kısmı çok önemli! Bu sorunu yaşamış olabilirim ya da yaşamamış olabilirim ve bu cevaba geri dönene kadar başımı kaşıyordum.
Tyler Lazenby

@Quassnoi Üzgünüm. Bu sadece WordPress \ wpdb hazırlama problemi gibi görünüyor. Tekrar özür dilerim.
vee

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

2
Bu yöntemi CURDATE () - INTERVAL 30
Dan

1
@ErmSo nedenini bilebilir miyim?
ince

3
Yalan söylemeyeceğim - bu 2 yıl önceydi ve hatırlayamıyorum! Pardon: P
Dan

1
DATE_FORMAT(create_date, '%m/%d/%Y')
Kullanmaya

@Dan Önceki tarihi parantez içine alarak daha okunaklı hale getirmeyi tercih ediyorum: ... WHERE create_date BETWEEN (NOW() - INTERVAL 30 DAY) AND NOW()
Kris Craig

10

DATE_FORMATbir dize döndürür, bu nedenle BETWEENyan tümcenizde iki dize kullanıyorsunuz , bu beklediğiniz gibi çalışmayacak.

Bunun yerine, içinde biçimine tarih dönüştürmek SELECTve yapılacak BETWEENfiili tarihlerde. Örneğin,

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

Bunu mysql'de de yazabilirsiniz -

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

SABİT


2
Dikkat: Artan oylara rağmen, bu son 30 gün değil önümüzdeki 30 gün / ay içindeki tarihleri ​​seçer !
JonBrave

4
Kabul edildi, WHERE create_date> DATE_ADD (NOW (), INTERVAL -1 MONTH) olmalıdır;
Bhavik P.

6

Geçerli tarih etkinliği ve önceki 30 gün için tüm etkinlik için bunu kullanın, çünkü SYSDATE bir gündeki değişken olduğundan önceki 30. gün o güne ait tüm verilere sahip olmayacaktır.

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

1

İşte curdate()fonksiyon kullanmadan bir çözüm, bu TSQLsanırım kullananlar için bir çözüm

SELECT myDate
FROM myTable
WHERE myDate BETWEEN DATEADD(DAY, -30, GETDATE()) AND GETDATE()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.