MySQL क्वेरी - आज और आखिरी 30 दिनों के बीच रिकॉर्ड


122

मैं पिछले 30 दिनों के भीतर डेटाबेस में जोड़े गए सभी रिकॉर्ड वापस करना चाहता हूं। मुझे प्रदर्शन उद्देश्यों के कारण दिनांक को मिमी / dd / yy में बदलने की आवश्यकता है।

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

मेरा बयान पिछले 30 दिनों के रिकॉर्ड को सीमित करने में विफल है - यह सभी रिकॉर्डों का चयन करता है।

क्या कोई मुझे सही दिशा दिखा सकता है? ऐसा महसूस होता है कि मैं करीब हूं।

धन्यवाद और एक महान सप्ताह है।

जवाबों:


292

आपको क्लॉज DATE_FORMATमें आवेदन करना होगा SELECT, न कि WHEREक्लॉज में:

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

यह भी ध्यान रखें कि CURDATE()रिटर्न केवल DATEतारीख से भाग, इसलिए यदि आप की दुकान create_dateके रूप में एक DATETIMEभरा समय भाग के साथ, इस प्रश्न के आज के रिकॉर्ड का चयन नहीं होगा।

इस स्थिति में, आपको NOWइसके बजाय उपयोग करने की आवश्यकता होगी :

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

इस उत्तर का दूसरा भाग बहुत महत्वपूर्ण है! मुझे उस समस्या का सामना करना पड़ा या नहीं हो सकता था और मैं इस जवाब पर वापस आने तक अपना सिर खुजला रहा था।
टायलर लेज़ेनबाई

@Quassnoi मुझे क्षमा करें। ऐसा लगता है कि वर्डप्रेस \ wpdb केवल समस्या तैयार करता है। दोबारा माफी चाहूंगा।
vee

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

2
मैं इस विधि को BETWEEN CURDATE () - INTERVAL 30
Dan

1
@ErmSo मुझे पता है क्यों कर सकते हैं?
स्लिम

3
मैं झूठ नहीं बोलूंगा - यह 2 साल पहले था और मुझे याद नहीं आ रहा है! क्षमा करें: P
Dan

1
उपयोग करने की आवश्यकता नहीं हैDATE_FORMAT(create_date, '%m/%d/%Y')
kaz

@ क्या मैं कोष्ठक में पिछली तिथि को संलग्न करके इसे और अधिक पठनीय बनाना पसंद करता हूं: ... WHERE create_date BETWEEN (NOW() - INTERVAL 30 DAY) AND NOW()
क्रिस क्रेग

10

DATE_FORMATएक स्ट्रिंग लौटाता है, इसलिए आप अपने BETWEENक्लॉज में दो स्ट्रिंग्स का उपयोग कर रहे हैं , जो आपके अपेक्षा के अनुरूप काम नहीं कर रहा है।

इसके बजाय, दिनांक को अपने प्रारूप में रूपांतरित करें SELECTऔर प्रारूप करेंBETWEEN वास्तविक तिथियों के लिए करें। उदाहरण के लिए,

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

आप इसे mysql में भी लिख सकते हैं -

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

निर्धारित


2
खबरदार: अप-वोट के बावजूद, यह अगले 30 दिनों / महीनों में तारीखों का चयन करता है , न कि पिछले 30 दिनों का!
जॉनब्र्वे

4
सहमत होना चाहिए, जहां पर create_date> DATE_ADD (अब (), INTERVAL -1 MONTH) होना चाहिए;
भाविक पी।

6

वर्तमान दिनांक गतिविधि के लिए और पिछले 30 दिनों के लिए पूर्ण गतिविधि इसका उपयोग करें, क्योंकि SYSDATE एक दिन में परिवर्तनशील है, पिछले 30 वें दिन उस दिन के लिए संपूर्ण डेटा नहीं होगा।

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

1

यहां curdate()फ़ंक्शन का उपयोग किए बिना एक समाधान है , यह उन लोगों के लिए एक समाधान है जो TSQLमेरे अनुमान का उपयोग करते हैं

SELECT myDate
FROM myTable
WHERE myDate BETWEEN DATEADD(DAY, -30, GETDATE()) AND GETDATE()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.