Önceki ayın tüm satırlarını almak için sorgu


92

Veritabanımda geçen ay oluşturulan tüm satırları seçmem gerekiyor.

Örneğin, geçerli ay Ocak ise, Aralık ayında oluşturulan tüm satırları döndürmek istiyorum, ay Şubat ise, Ocak ayında oluşturulan tüm satırları döndürmek istiyorum. Bir var date_createdbenim veritabanında sütun olduğunu listeleri bu biçimde yaratılan tarihi: 2007-06-05 14:50:17.

Yanıtlar:


202
SELECT * FROM table
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)

70
SELECT * FROM table WHERE date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
Ghazanfar Mir

12
@GhazanfarMir sorgunuz soruyla tam olarak eşleşmiyor, oysa yukarıdaki cevap uyuyor. Sizinki, geçen ay bu gün ile dün arasındaki satırları döndürür.
Matt Passell

@MattPassell Üzgünüm ama betweensınırları dahil ediyor .. İçinde güncel tarihi de içerecek. Neden / Nasıl dün ile sınırlı kalacak? Lütfen detaylandırın?
Ghazanfar Mir

5
Ne demek istediğini anlıyorum .. Evet haklısın ..
Sorgum

Peki ya current_datebugün değil de müşteriden rastgele bir tarih veriliyorsa?
dios231

23

İşte başka bir alternatif. Dizine alınmış DATEveya DATETIMEtür alanınız olduğunu varsayarsak , bu, biçimlendirilmiş tarihler dizin kullanılmadan önce dönüştürülecek türden dizini kullanmalıdır. EXPLAIN ile görüntülendiğinde rangesorgu yerine bir sorgu görmelisiniz .index

SELECT
    * 
FROM
    table
WHERE 
    date_created >= DATE_FORMAT( CURRENT_DATE - INTERVAL 1 MONTH, '%Y/%m/01' ) 
AND
    date_created < DATE_FORMAT( CURRENT_DATE, '%Y/%m/01' )

+1. Çok daha fazla indeks dostu. Ayrıca STR_TO_DATEetrafına bir de atabilirsiniz , DATE_FORMATböylece her zaman tarih nesneleriyle ilgilenir.
Leigh

15

İleri tarih yoksa ...

SELECT * 
FROM   table_name 
WHERE  date_created > (NOW() - INTERVAL 1 MONTH);

Test edildi.


3
Sanırım farklı bir şey arıyorlardı. Örneğin, geçen ayın tüm kayıtları (yani 1 Ekim - 31 Ekim 2012 23:59:59). Yukarıdaki sorgu, bugünün tarih ve saatinden yaklaşık son 30 günü döndürür .
Leigh

13

Hobodave'in cevabına alternatif olarak

SELECT * FROM table
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)

Aynısını EXTRACT ile, birim olarak YEAR_MONTH kullanarak elde edebilirsiniz, böylece AND'ye ihtiyacınız olmaz, şöyle:

SELECT * FROM table
WHERE EXTRACT(YEAR_MONTH FROM date_created) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL
1 MONTH)

Bu aylarca harika çalışıyor, ancak maalesef YEAR_WEEK geçici bir aralık yok , bu nedenle aylar yerine haftalara ihtiyacınız varsa hobodave'in cevabına geri dönmeniz gerekir.
Danny Beckett

8
SELECT *
FROM  yourtable
where DATE_FORMAT(date_created, '%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 1 month),'%Y-%m')

Bu, son 30 veya 31 güne ait kayıtların aksine, önceki takvim ayındaki tüm kayıtları döndürmelidir.


Söylemeyi unuttum ... bu, son 30 veya 31 güne ait kayıtların aksine, önceki takvim ayındaki tüm kayıtları iade etmelidir.
Gregg 21

Bence bu, kabul edilen cevaptan daha basit olduğu ve aynı sonucu sağladığı için kabul edilen cevap olmalıdır
Grant

3

Bu sorunun cevabı zaten seçilmiş olsa da, en basit sorgunun olacağına inanıyorum

SELECT * 
FROM table 
WHERE 
date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();

2
Hayır, tam olarak değil. @Hobodave tarafından verilen cevap hakkındaki yorumunuza cevabımı görün
Matt Passell

@MattPassell Haklısınız, soruyu yanlış anladım .. Sonucun SADECE geçen aya ait kayıtlarla sınırlı olması gerektiği noktasını kaçırdım.
Ghazanfar Mir

2
WHERE created_date >= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) 
  AND created_date <= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)), INTERVAL 0 DAY) 

Bu benim için çalıştı (Bu ay sorguyu hangi gün çalıştırdığınıza bakılmaksızın geçen ay oluşturulan tüm kayıtları seçer)


1

select fields FROM table WHERE date_created LIKE concat(LEFT(DATE_SUB(NOW(), interval 1 month),7),'%');

bu, eğer date_created'ınız indekslenmişse, alan değerine herhangi bir dönüşüm fonksiyonu uygulamadığından, bir indeksten yararlanabilecektir.


@ggiroux - Yine de LIKE'ı uygulamadan önce tarihi bir karakter türüne dönüştürmek zorunda.
martin clayton

evet gerçekten, ama yine de seçilen cevap IMHO üzerinde bir gelişme (IFF
tarihini oluşturuyor

1

İşte geçen ayın kayıtlarını almak için sorgu:

SELECT *
FROM `tablename`
WHERE `datefiled`
BETWEEN DATE_SUB( DATE( NOW( ) ) , INTERVAL 1
MONTH )
AND 
LAST_DAY( DATE_SUB( DATE( NOW( ) ) , INTERVAL 1
MONTH ) )

Saygılarımızla - saqib


Bu sorguyu çalıştırmayı denedin mi? Gördüğüm kadarıyla, önceki ayların tüm tarihlerini seçmiyor (şu şekildedir: Ocak ayı tüm Şubat boyunca verileri döndürür), ancak bir ay önce aynı günden başlayan bir aralıktaki verileri döndürür
Nico Haase

0

Tek koşullu alternatif

SELECT * FROM table
WHERE YEAR(date_created) * 12 + MONTH(date_created)
    = YEAR(CURRENT_DATE) * 12 + MONTH(CURRENT_DATE) - 1

-1
SELECT *  FROM table  
WHERE  YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)

Bu sorguyu çalıştırmayı denedin mi? Gördüğüm kadarıyla, önceki ayların tüm tarihlerini seçmiyor (şu şekildedir: Ocak ayı tüm Şubat boyunca verileri döndürür), ancak bir ay önce aynı günden başlayan bir aralıktaki verileri döndürür
Nico Haase

birkaç değişiklik yaptım, şimdi çalışıp çalışmadığını kontrol et
sid busa
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.