पिछले महीने से सभी पंक्तियों को प्राप्त करने की क्वेरी


92

मुझे अपने डेटाबेस में सभी पंक्तियों का चयन करने की आवश्यकता है जो पिछले महीने बनाई गई थीं।

उदाहरण के लिए, यदि चालू माह जनवरी है, तो मैं दिसंबर में बनाई गई सभी पंक्तियों को वापस करना चाहता हूं, यदि महीना फरवरी है, तो मैं उन सभी पंक्तियों को वापस करना चाहता हूं जो जनवरी में बनाई गई थीं। date_createdमेरे डेटाबेस में एक कॉलम है जो इस प्रारूप में बनाई गई तारीख को सूचीबद्ध करता है 2007-06-05 14:50:17:।

जवाबों:


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();
ग़ज़नफ़र मीर

12
@GhazanfarMir आपकी क्वेरी प्रश्न से काफी मेल नहीं खाती है, जबकि ऊपर दिए गए उत्तर है। तुम्हारा कल के माध्यम से पिछले महीने इस दिन के बीच पंक्तियों को लौटाता है।
मैट पासेल

@MattPassell मुझे खेद है लेकिन betweenसीमाओं के समावेशी है .. इसमें वर्तमान तिथि भी शामिल होगी। क्यों / कैसे यह कल तक सीमित रहेगा ?? कृपया विस्तार से बताएं?
गज़नफ़र मीर

5
मैं देख रहा हूँ कि आपका क्या मतलब है .. हाँ आप सही हैं .. मेरी क्वेरी वही नहीं है जो ओपी चाहता था .. मैंने इस सवाल को गलत समझा
ग़ज़फ़र मीर

अगर current_dateयह आज नहीं है, लेकिन ग्राहक से दी गई एक यादृच्छिक तारीख के बारे में क्या है ?
dios231

23

यहाँ एक और विकल्प है। मान लें कि आपके पास अनुक्रमित DATEया DATETIMEप्रकार फ़ील्ड है, तो यह सूचकांक का उपयोग करना चाहिए क्योंकि स्वरूपित दिनांक को अनुक्रमणिका का उपयोग करने से पहले परिवर्तित किया जाएगा। तब EXPLAIN के साथ देखे जाने पर आपको rangeक्वेरी के बजाय एक क्वेरी देखना चाहिए ।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। ज्यादा इंडेक्स फ्रेंडली है। तुम भी STR_TO_DATEचारों ओर फेंक सकता है DATE_FORMATतो यह हमेशा दिनांक वस्तुओं के साथ काम कर रहा है।
लेह

15

अगर भविष्य की तारीखें नहीं हैं ...

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

का परीक्षण किया।


3
मुझे लगता है कि वे कुछ अलग खोज रहे थे। पिछले महीने से सभी रिकॉर्ड्स (यानी 1 अक्टूबर - 31 अक्टूबर 2012 23:59:59)। उपरोक्त क्वेरी आज की तारीख और समय से अंतिम ~ 30 या इतने दिनों में वापस आ जाएगी ।
लीह

13

वैकल्पिक रूप से हॉबोववे के उत्तर के लिए

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

आप यूनिट के रूप में YEAR_MONTH का उपयोग करके EXTRACT के साथ समान हासिल कर सकते हैं, इस प्रकार आपको इसकी आवश्यकता नहीं होगी, जैसे:

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

यह महीनों के लिए बहुत अच्छा काम करता है, लेकिन दुर्भाग्य से कोई YEAR_WEEK अस्थायी अंतराल नहीं है , इसलिए यदि आपको महीनों के बजाय हफ्तों की आवश्यकता है, तो आपको हॉबोववे के उत्तर पर वापस आना होगा।
डैनी बेकेट

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

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


मैं उल्लेख करना भूल गया ... पिछले कैलेंडर महीने के सभी रिकॉर्ड को वापस करना चाहिए, क्योंकि पिछले 30 या 31 दिनों के रिकॉर्ड के विपरीत।
ग्रीग

मेरी राय में यह स्वीकृत उत्तर होना चाहिए क्योंकि स्वीकृत उत्तर की तुलना में यह सरल है, अभी तक एक ही परिणाम प्रदान करता है
ग्रांट

3

भले ही इस प्रश्न का उत्तर पहले ही चुना जा चुका है, हालांकि, मेरा मानना ​​है कि सबसे सरल प्रश्न होगा

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

2
नहीं, बिलकुल नहीं। @Hobodave द्वारा दिए गए उत्तर पर अपनी टिप्पणी के लिए मेरी प्रतिक्रिया देखें
मैट

@MattPassell आप सही हैं, मैंने सवाल गलत समझा .. मैं इस बिंदु से चूक गया कि परिणाम केवल पिछले महीने से रिकॉर्ड तक ही सीमित होना चाहिए।
गज़नफ़र मीर

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) 

इसने मेरे लिए काम किया (पिछले महीने से बनाए गए सभी रिकॉर्डों का चयन करता है, भले ही इस महीने आप जिस दिन भी क्वेरी चलाते हों)


1

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

यदि आपका date_created अनुक्रमित है, तो यह एक इंडेक्स का लाभ लेने में सक्षम होगा, क्योंकि यह फ़ील्ड मान पर कोई भी परिवर्तन फ़ंक्शन लागू नहीं करता है।


@ggiroux - हालांकि LIKE को लागू करने से पहले उसे तिथि को चरित्र प्रकार में बदलना होगा।
मार्टिन क्लेटन

हाँ वास्तव में, लेकिन अभी भी चयनित उत्तर पर सुधार IMHO (IFF date_created अनुक्रमित है)
ggiroux

1

यहाँ पिछले महीने के रिकॉर्ड प्राप्त करने के लिए प्रश्न है:

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

सादर - साकिब


क्या आपने उस क्वेरी को चलाने की कोशिश की है? जहाँ तक मैं देख रहा हूँ, यह पिछले महीनों की सभी तारीखों का चयन नहीं करेगा (जैसे: जनवरी से पूरे फरवरी तक का डेटा लौटाएँ), लेकिन एक महीने पहले उसी दिन से शुरू होने वाली रेंज से डेटा
लौटाएँ

0

एकल स्थिति के साथ वैकल्पिक

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)

क्या आपने उस क्वेरी को चलाने की कोशिश की है? जहाँ तक मैं देख रहा हूँ, यह पिछले महीनों की सभी तारीखों का चयन नहीं करेगा (जैसे: जनवरी से पूरे फरवरी तक का डेटा लौटाएँ), लेकिन एक महीने पहले उसी दिन से शुरू होने वाली रेंज से डेटा
लौटाएँ

मैंने कुछ बदलाव किए हैं, अब जांच लें कि काम है या नहीं
बुआ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.