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();
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:
SELECT * FROM table
WHERE exec_datetime BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW();
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add
Kullanmak istemeyen herkes için şunu DATE_SUB
kullanın CURRENT_DATE
:
SELECT CURRENT_DATE - INTERVAL 30 DAY
NOW() - INTERVAL 30 DAY
. Soru "mevcut tarih saatinden 30 gün çıkar" dan bahsedildiği için, OP'nin istediği bu olmayabilir.
current_timestamp
yerinecurrent_date
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);
BETWEEN
Gerç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.
NOW()
ve hala cevabınızda kullanıyorsunuz. o_O PS: sorgunuz OP'nin muhtemelen istediği başka bir sonuç döndürmez
BETWEEN
ve >=
farklı operatörler, biliyor musunuz? Benim sorgu için belirlenen sonuç sınırlayan 30 days ago AND today
bu, everything after 30 days ago
. Bu yüzden tomorrow
kayıtlar benimki ve orijinal sorgunuzla eşleşmeyecek, ancak bu cevapla eşleşecek
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
Ayrıca kullanabilirsiniz
select CURDATE()-INTERVAL 30 DAY
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')
SQL'de tarih biçimini kullanarak biçimlendirebilirsiniz.
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
.
interval
gün olmayan bir bileşene ihtiyaç duyduğunuz durumlar içindir.
subdate(curdate(), 30)
bunun bundan daha CURRENT_DATE - INTERVAL 30 DAY
mı tehlikeli olduğunu iddia ediyorsun ? Kanıtın var mı? Ve bu ne kadar hızlı olurdu? Birkaç mikrosaniye mi?
subdate
potansiyel 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?
curdate()
aslında yanlış bir seçim olabilir, çünkü OP "mevcut tarih saatinden 30 gün çıkarmak" istiyordu (benimki vurgu).