MySQL का चयन करें, जहां दिनभर मैच होते हैं (और जरूरी नहीं कि समय)


127

मेरे पास एक तालिका है जिसमें एक डेटाइम कॉलम है। मैं समय की परवाह किए बिना दिए गए दिन के सभी रिकॉर्ड वापस करना चाहता हूं। या दूसरे शब्दों में, यदि मेरी तालिका में केवल निम्नलिखित 4 रिकॉर्ड होते हैं, तो केवल 2 और 3 को वापस कर दिया जाएगा यदि मैं 2012-12-25 तक सीमित करता हूं।

2012-12-24 00:00:00
2012-12-25 00:00:00
2012-12-25 06:00:00
2012-12-26 05:00:00

पर जॉन वू ने जवाब देखें stackoverflow.com/questions/14769026/...
ekerner

जवाबों:


326

कभी भी एक चयनकर्ता का उपयोग न करें DATE(datecolumns) = '2012-12-24'- यह एक प्रदर्शन हत्यारा है:

  • यह DATE()उन सभी पंक्तियों के लिए गणना करेगा , जिनमें वे भी शामिल हैं, जो मेल नहीं खाते
  • यह क्वेरी के लिए एक सूचकांक का उपयोग करना असंभव बना देगा

यह उपयोग करने के लिए बहुत तेज है

SELECT * FROM tablename 
WHERE columname BETWEEN '2012-12-25 00:00:00' AND '2012-12-25 23:59:59'

क्योंकि यह गणना के बिना सूचकांक उपयोग की अनुमति देगा।

संपादित करें

जैसा कि Use_By_Already द्वारा बताया गया है, 2012 में इनबिल्ट जवाब के बाद से, MySQL के कुछ संस्करण सामने आए हैं, जहां एक दिन के अंत के रूप में '23: 59: 59 'का उपयोग करना सुरक्षित नहीं है। एक अद्यतन संस्करण को पढ़ना चाहिए

SELECT * FROM tablename 
WHERE columname >='2012-12-25 00:00:00'
AND columname <'2012-12-26 00:00:00'

जवाब का सार, यानी एक परिकलित अभिव्यक्ति पर चयनकर्ता का परिहार, निश्चित रूप से अभी भी खड़ा है।


मैं टिप्पणी करने वाला था कि a1ex07 का समाधान दूसरों के समान अच्छा नहीं है। आपके पोस्ट को पढ़ने के बाद, शायद मुझे अपनी सोच को उलटने की ज़रूरत है!
user1032531

2
बस दो सर्वरों पर परीक्षण किया गया है MUCH (10x कम से कम) तारीख से तेज () = '' विशेष रूप से विशाल तालिकाओं के लिए। धन्यवाद
zzapper

1
@KonradViltersten मैंने क्वेरी को वाक्यांशित करने के लिए एक बहुत ही क्रियात्मक तरीके का इस्तेमाल किया ताकि इसे और अधिक पठनीय बनाया जा सके और घर को मेरी बात को सुधारने में मदद मिल सके। A1ex07 के उत्तर में विरल सिंटैक्स है।
यूजेन रीक

9
@KonradViltersten - अभी तक बेहतर WHERE col >= '2012-12-25' AND col < '2012-12-25' + INTERVAL 1 DAY:। यह 0 समय से बचा जाता है और के लिए काम करता है DATE, DATETIME, DATETIME(6), आदि और छलांग दिन, आदि के साथ सौदों
रिक जेम्स

1
'2012-12-25 23:59:59' अंत के दिन के रूप में मान्य नहीं है, यह हमेशा एक बुरा विचार था और यह MySQL के संस्करणों के लिए कीड़े पैदा करेगा जो उप-दूसरी बार परिशुद्धता का समर्थन करते हैं। रिक जेम्स (ऊपर) या a1ex07 (अन्य उत्तर) द्वारा दृष्टिकोण का उपयोग करने के लिए बहुत बेहतर है
Used_By_Already

34

... WHERE date_column >='2012-12-25' AND date_column <'2012-12-26'संभावित रूप से बेहतर काम कर सकता है (यदि आपके पास date_column पर कोई इंडेक्स है) की तुलना में DATE


1
मुझे वास्तव में आश्चर्य है कि क्या तेज है - यह या BETWEENसमाधान ... किसी को भी चिन्हित किया गया है?
jave.web

6
इससे कोई फर्क नहीं पड़ना चाहिए। BETWEENलिखने का एक तरीका है field >= value1 and fied<= value2
a1ex07

1
ध्यान दें कि MySQL मैनुअल के अनुसार: "दिनांक या समय मानों के साथ BETWEEN का उपयोग करते समय सर्वोत्तम परिणामों के लिए, CAST () का उपयोग करके स्पष्ट रूप से वांछित डेटा प्रकार में मानों को परिवर्तित करें। उदाहरण: यदि आप DATETIME की तुलना दो DATE मानों से करते हैं, तो DATE परिवर्तित करें। DATETIME मानों के मान। यदि आप DATE की तुलना में '2001-1-1' जैसे स्ट्रिंग कंटेंट का उपयोग करते हैं, तो स्ट्रिंग को DATE तक कास्ट करें। " इसलिए जब तक वे सभी एक ही प्रकार के न हों, तब तक उन्हें स्पष्ट रूप से डालना सबसे अच्छा है।
टेकड्यूड

21

आप उपयोग कर सकते हैं %:

SELECT * FROM datetable WHERE datecol LIKE '2012-12-25%'

13
लगता है DATE (datetimecol) जितना धीमा है। यूजेन या a1ex07 के समाधान का बेहतर उपयोग करें।
मैरी फिशर

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