MySQL içinde geçerli datetime 30 gün nasıl çıkarılır?


197

MySQL'de geçerli datetime'dan 30 günü nasıl çıkarabilirim?

SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();

Yanıtlar:



128

Kullanmak istemeyen herkes için şunu DATE_SUBkullanın CURRENT_DATE:

SELECT CURRENT_DATE - INTERVAL 30 DAY

2
Yapabilseydim bunu +10 verirdim. SQL, okunabilirlikle ilgili olmalıdır ve bunu yapmanın en okunabilir yolu budur.
Colin 't Hart

9
Daha okunabilir ama kullanmaktan daha farklı sonuç NOW() - INTERVAL 30 DAY. Soru "mevcut tarih saatinden 30 gün çıkar" dan bahsedildiği için, OP'nin istediği bu olmayabilir.
ypercubeᵀᴹ

2
@ ypercubeᵀᴹ sonra kullanmak current_timestampyerinecurrent_date
isapir

21

NOW()Sorgu her zaman farklı olduğu için sorgu önbellekleme veya optimizasyonunu kaybettiğiniz için kullanmayalım . MySQL belgelerinde kullanmamanız gereken işlevlerin listesine bakın .

Aşağıdaki kodda, bu tablonun zamanla büyüdüğünü varsayalım. Yeni şeyler eklenir ve yalnızca son 30 gün içindeki öğeleri göstermek istersiniz. Bu en yaygın durumdur.

Tarihin dize olarak eklendiğini unutmayın. Tarihi bu şekilde, arama kodunuzdan eklemek, NOW()işlevi önbelleğe almayı öldürdüğünden kullanmaktan daha iyidir .

SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY);

BETWEENGerçekten bu ikinci saniyeden 30 gün öncesine kadar bir şeyler istiyorsanız kullanabilirsiniz , ancak bu benim deneyimimde yaygın bir kullanım durumu değil, bu yüzden umarım basitleştirilmiş sorgu size iyi hizmet edebilir.


3
Yani hiçbir fayda önermediniz NOW()ve hala cevabınızda kullanıyorsunuz. o_O PS: sorgunuz OP'nin muhtemelen istediği başka bir sonuç döndürmez
zerkms

@zerkms Bu sorgu, sorgunuzdan nasıl farklı bir sonuç kümesi oluşturur?
user784637

2
@ user784637: uhm BETWEENve >=farklı operatörler, biliyor musunuz? Benim sorgu için belirlenen sonuç sınırlayan 30 days ago AND todaybu, everything after 30 days ago. Bu yüzden tomorrowkayıtlar benimki ve orijinal sorgunuzla eşleşmeyecek, ancak bu cevapla eşleşecek
zerkms

Tamam, benim hatam. Genellikle bu tür sorgular zamanla büyüyen canlı tablolardadır. Bu yüzden arasına düştüm. Yukarıdaki cevabımı açıkladım.
Joseph Lust

@JosephLust, Performans sorunlarını çözmek için bunun yerine çözümümü kullanın.
Pacerier

17

MySQL artık günleri çıkarıyor:

select now(), now() - interval 1 day

Baskılar:

2014-10-08 09:00:56     2014-10-07 09:00:56

Diğer Aralıklı İfade Birimi argümanları:

https://dev.mysql.com/doc/refman/5.5/en/expressions.html#temporal-intervals

select now() - interval 1 microsecond 
select now() - interval 1 second 
select now() - interval 1 minute 
select now() - interval 1 hour 
select now() - interval 1 day 
select now() - interval 1 week 
select now() - interval 1 month 
select now() - interval 1 year 


1
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')

SQL'de tarih biçimini kullanarak biçimlendirebilirsiniz.


0

diğer yol

SELECT COUNT(*) FROM tbl_debug WHERE TO_DAYS(`when`) < TO_DAYS(NOW())-30 ;

0

Saatin kullanılmasına değil, yalnızca tarihe ihtiyacınız varsa:

select*from table where exec_datetime
between subdate(curdate(), 30)and curdate();

Yana curdate()atlar zamanı bileşeni, bu kadar potansiyel olarak daha hızlı now()ve sadece tarih ilgilendiğiniz durumlarda daha "anlamsal olarak doğru".

Ayrıca, subdate()'2-arity aşırı yük potansiyel olarak kullanmak daha hızlıdır interval. intervalgün olmayan bir bileşene ihtiyaç duyduğunuz durumlar içindir.


11
Öyleyse, subdate(curdate(), 30)bunun bundan daha CURRENT_DATE - INTERVAL 30 DAYmı tehlikeli olduğunu iddia ediyorsun ? Kanıtın var mı? Ve bu ne kadar hızlı olurdu? Birkaç mikrosaniye mi?
ypercubeᵀᴹ

2
Hiç bir fikrim yok. Kendi yorumlarımı kesinlikle onaylayamıyorum. "Potansiyel olarak" daha hızlı iddia hakkında hala hiçbir kanıt, belirleyici veya koşullu göremiyorum. Ve biraz daha hızlı olsa bile, durum bir kez değerlendirilir. Sorguyu dakikada milyon kez çalıştırmadığınız sürece fark önemli olmayacaktır.
ypercubeᵀᴹ

2
Sanırım subdatepotansiyel olarak daha hızlı olmanın muhtemelen bir şekilde, "2-arity aşırı yükü" ile açıklandığını, ancak, bu aptalca bir soru ise lütfen beni affet, bu kelimeler ne anlama geliyor (bir işleve göre) )? Özellikle, "2-arity" nedir?
Andriy M

1
Ayrıca, sorunun ifadesine göre, curdate()aslında yanlış bir seçim olabilir, çünkü OP "mevcut tarih saatinden 30 gün çıkarmak" istiyordu (benimki vurgu).
Andriy M

1
@AndriyM, Bu konu 50 bin görüntüleme aldığından, sadece zaman bileşeniyle ilgilenen insanlar için cevabı burada bırakacağım. Ve "arity" ile ilgili olarak, bu argüman sayısından bahsediyor . Evet bu doğru, her şey eşit olduğunda, 2-arity fonksiyonu potansiyel olarak 3-arity fonksiyonundan daha hızlıdır. Plakaya yeni bilgiler eklenene kadar bu geçerli olur.
Pacerier
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.