2015-06-10 2 views
9

मेरे पास एकाधिक दिनांक प्रकार फ़ील्ड वाले एक MySQL डीबी तालिका है। मुझे इस टेबल पर अलग-अलग चयन प्रश्नों की आवश्यकता है, लेकिन मुझे यकीन नहीं है कि उसी महीने से रिकॉर्ड खोजने के लिए सबसे अच्छा तरीका कौन सा है।एक महीने के भीतर रिकॉर्ड्स खोजने के लिए कुशल चयन क्वेरी

मैं जानता हूँ कि मैं निम्नलिखित कर सकते हैं:

SELECT * 
    FROM table 
WHERE MONTH(somedate) = 5 
    AND YEAR(somedate) = 2015 

लेकिन मैं पढ़ने कि कुशल नहीं है और है कि मैं वास्तविक तिथियां उपयोग करने के साथ जाना चाहिए रखने के लिए, यानी

SELECT * 
    FROM table 
WHERE somedate BETWEEN '2015-05-01' AND '2015-05-31' 

हालांकि, सभी मैं PHP से आने वाले चर के रूप में महीना और वर्ष होगा। यदि मैं दूसरे विकल्प के साथ जाता हूं तो मैं महीने के आखिरी दिन की आसानी से और त्वरित गणना कैसे करूं?

+0

मुझे 'डीबी' में 'महीने/वर्ष' से धीमा होने और 'जैसे', मेरे डीबी पर मिल रहा है। महीना/वर्ष = 'पंक्तियां दिखा रहा है 0 - 2 9 (77 कुल, प्रश्न 0.0825 सेकेंड लिया गया)'। = 'पंक्तियों को दिखा रहा है 0 - 2 9 (77 कुल, क्वेरी ने 0.1059 सेकेंड लिया) '। पसंद = 'पंक्तियां दिखा रहा है 0 - 2 9 (77 कुल, प्रश्न 0.0815 सेकंड लिया)'। यह 7k पंक्ति तालिका पर है। हालांकि यह धागा दूसरी दिशा में इंगित करता है। http://dba.stackexchange.com/questions/96245/mysql-date-field-filter-by-like-vs-month – chris85

+0

MySQL 'somedate' के अग्रणी कॉलम वाले इंडेक्स का प्रभावी उपयोग कर सकता है। यदि आपके पास ऐसी कोई अनुक्रमणिका नहीं है, तो आप एक उदाहरण बना सकते हैं। 'तालिका पर इंडेक्स बनाएं (somedate) '। जब तक तालिका तालिका में पंक्तियों में से 10% से कम लौट रही है, तो सूचकांक क्वेरी को बहुत तेज बना देगा। किसी दिन कॉलम के चारों ओर लिपटे कार्यों के साथ, MySQL को तालिका में प्रत्येक पंक्ति पर उन कार्यों का मूल्यांकन करना होगा। – spencer7593

+0

निष्पादन योजना देखने के लिए 'EXPLAIN' का उपयोग करें। प्रदर्शन तुलना के लिए, सुनिश्चित करें कि क्वेरी परिणाम क्वेरी कैश से वापस नहीं आ रहे हैं। ऐसा करने के कई तरीके हैं, उदाहरण के लिए'SQL_NO_CACHE' हिट, क्वेरी में उपयोगकर्ता परिभाषित चर शामिल करें, क्वेरी कैश इत्यादि अक्षम करें। (हम वास्तव में हमारे MySQL सर्वर को केवल * क्वेरी * कैश करने के लिए कॉन्फ़िगर किया गया है जिसमें 'SQL_CACHE' संकेत शामिल है , इसलिए हम नियंत्रित करते हैं कि कौन से प्रश्नों को कैश किया जा सकता है, और परिणामों को उन प्रश्नों से बाहर निकालने से रोकें जिन्हें हमें कैश की आवश्यकता नहीं है।) – spencer7593

उत्तर

9

में दिनों देना महीने के अंतिम दिन की गणना न होगा। इसके बजाय अगले महीने के पहले दिन की गणना करें।

आपकी क्वेरी की तरह इस

WHERE t.mydatetimecol >= '2015-05-01' 
    AND t.mydatetimecol < '2015-05-01' + INTERVAL 1 MONTH 

नोट है कि हम एक से कम तुलना कर रहे हैं, नहीं हो सकता है एक "से कम या बराबर करने के लिए" ... इस टाइमस्टैम्प की तुलना के लिए बहुत सुविधाजनक है और डेटाटाइम कॉलम, जिसमें एक समय भाग शामिल हो सकता है।

ध्यान दें कि BETWEEN तुलना "कम या उसके बराबर" है। ऊपर प्रश्न के एक तुलना बराबर प्राप्त करने के लिए, हम

WHERE t.mydatetimecol 
     BETWEEN '2015-05-01' AND '2015-05-01' + INTERVAL 1 MONTH + INTERVAL -1 SECOND 

करने के लिए (यह मान लिया गया है DATETIME और TIMESTAMP का संकल्प एक दूसरे के लिए नीचे है कि आवश्यकता होगी। इस तरह के एसक्यूएल सर्वर, संकल्प के रूप में अन्य डेटाबेस, में एक सेकंड से बेहतर है, इसलिए हमारे पास '2015-05-31 23: 59: 59.9 7 9' के मूल्य के साथ एक पंक्ति गुम होने की संभावना होगी। हमें पहले दिन से कम की तरह कोई समस्या नहीं है अगले महीने की तुलना में ... < '2015-06-01'

महीने या तारीख गणित करने की कोई ज़रूरत नहीं है, तो MySQL इसे आपके लिए करें। यदि आप महीने में 1 जोड़ने के साथ मिलते हैं, तो आपको रोलओवर को दिसंबर से संभालना होगा जनवरी, और incremen टी साल MySQL में पहले से ही बनाया गया है।

+0

अच्छा काम स्पेंसर – AsConfused

3

date('t', strtotime("$year-$month-01")) महीने

+2

यह एक प्रदर्शन प्रश्न है, सवाल कैसे नहीं है .. – chris85

+0

हालांकि इस विशिष्ट कार्य के लिए "कैसे करें" प्रश्न अंत में पूछा गया था। मुझे लगता है कि एक बेहतर कलाकार होगा, और बाद में उस पर विस्तार कर सकता है अगर कोई और इसे पहले प्राप्त नहीं करता है। –

संबंधित मुद्दे