MySQL DATETIME फ़ील्ड से स्ट्रिंग के साथ DATE स्ट्रिंग की तुलना करता है


93

मेरे पास एक प्रश्न है: क्या DATETIME (2010-04-29 10:00) के रूप में संग्रहीत स्ट्रिंग्स के खिलाफ एक DATE स्ट्रिंग "2010-04-29" की तुलना करके MySQL डेटाबेस से चयन करना संभव है?

मेरे पास एक तिथि पिकर है जो डेटा को फ़िल्टर करता है और मैं इस तरह से DATETIME फ़ील्ड द्वारा तालिका को क्वेरी करना चाहूंगा:

SELECT * FROM `calendar` WHERE startTime = '2010-04-29'"

... और मैं उस पंक्ति को प्राप्त करना चाहूंगा जिसमें "2010-04-29 10:00" का DATETIME मूल्य है।

कोई सुझाव? धन्यवाद।

जवाबों:


163

निम्न का उपयोग करें:

SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'

बस संदर्भ के लिए मेरे पास 2 मिलियन रिकॉर्ड टेबल है, मैंने एक समान क्वेरी चलाई। सालिल्स उत्तर में 4.48 सेकंड लगे, ऊपर 2.25 सेकंड लगे।

इसलिए यदि तालिका BIG है तो मैं इसके बजाय सुझाव दूंगा।


8
पहला उत्तर इतना धीमा है, क्योंकि इसे तुलना से पहले प्रत्येक डेटाइम को एक स्ट्रिंग में प्रारूपित करना है। आपका बेहतर है, क्योंकि यह सीधे क्षेत्र से केवल दिनांक भाग की तुलना करता है, लेकिन यह अभी भी सूचकांक का उपयोग नहीं कर सकता है (mysql 5.1 पर परीक्षण किया गया है)
Marki555

1
यदि प्रदर्शन एक ऐसा मुद्दा है, तो तारीख और समय के हिस्से को अलग-अलग रखने पर विचार किया जा सकता है, ताकि एक INDEX को तारीख वाले हिस्से पर रखा जा सके।
थिएज रिजेबेक

1
यदि startTimeअनुक्रमित है तो यह क्वेरी इंडेक्स का उपयोग करने में सक्षम नहीं होगी ।
ज़म्रोनी पी। जुहारा

43

यदि आप उन सभी पंक्तियों का चयन करना चाहते हैं जहाँ DATETIME कॉलम का DATE भाग एक निश्चित शाब्दिक से मेल खाता है, तो आप इसे पसंद नहीं कर सकते:

WHERE startTime = '2010-04-29'

क्योंकि MySQL सीधे DATE और DATETIME की तुलना नहीं कर सकता है। MySQL क्या करता है, यह दिए गए DATE शाब्दिक समय '00: 00: 00 'के साथ है। तो आपकी हालत हो जाती है

WHERE startTime = '2010-04-29 00:00:00'

निश्चित रूप से नहीं जो आप चाहते हैं!

शर्त एक सीमा है और इसलिए इसे सीमा के रूप में दिया जाना चाहिए। कई संभावनाएं हैं:

WHERE startTime BETWEEN '2010-04-29 00:00:00' AND '2010-04-29 23:59:59'
WHERE startTime >= '2010-04-29' AND startTime < ('2010-04-29' + INTERVAL 1 DAY)

पहले गलत होने की एक छोटी सी संभावना है - जब आपका DATETIME कॉलम सब्सेकंड रिज़ॉल्यूशन का उपयोग करता है और 23:59:59 + एप्सिलॉन पर एक अपॉइंटमेंट होता है। सामान्य तौर पर मैं दूसरे संस्करण का उपयोग करने का सुझाव देता हूं।

दोनों वेरिएंट स्टार्टटाइम पर एक इंडेक्स का उपयोग कर सकते हैं जो टेबल बढ़ने पर महत्वपूर्ण हो जाएगा।


9
डेविड का संस्करण अच्छा नहीं है, यह अनुक्रमित का उपयोग नहीं कर सकता है। एक सूचकांक का उपयोग करने के लिए आपको सीधे स्तंभ पर फिल्टर करने के लिए है, एक समारोह (का एक परिणाम पर नहीं date(), year(), datediff()या किसी भी इसी तरह)
Marki555

मैं देख रहा था कि कैसे mysql डेटटाइम को धर्मान्तरित करता है, इसे जोड़ने के लिए धन्यवाद 00:00:00। अब मेरे परिणाम समझ में आते हैं
लेखाकार

1
अन्य उत्तरों की तुलना में यह सही तेज़ समाधान है जो उपलब्ध होने पर सूचकांक का उपयोग नहीं कर सकता है
जेम्रोनी पी। जुहारा

23
SELECT * FROM `calendar` WHERE DATE_FORMAT(startTime, "%Y-%m-%d") = '2010-04-29'"

या

SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'

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

मैं मानता हूं, उसका जवाब गलत है - सही जवाब डेविड ने नीचे पोस्ट किया था।
mindplay.dk 13:18 पर

1
कृपया, डेविड से उत्तर का उपयोग करें, क्योंकि यह अधिक तेज़ है। यह एक वैध है, लेकिन गति के लिए अच्छा नहीं है ...
xarlymg89

1
@ CarlosAlbertoMartínezGadea यह संस्करण धीमा है क्योंकि इसकी तुलना करने से पहले स्ट्रिंग को प्रत्येक मान को प्रारूपित करना होता है ... डेविड के संस्करण को इसकी आवश्यकता नहीं है, लेकिन फिर भी अनुक्रमित का उपयोग नहीं कर सकता है, इसलिए यह इष्टतम नहीं है। एक संस्करण के लिए XL_ से उत्तर देखें जो सूचकांक का उपयोग कर सकता है। दुर्भाग्य से इसे mysql में ठीक से करने का कोई बेहतर तरीका नहीं है
Marki555

1
मैंने इस उत्तर को अस्वीकृत कर दिया क्योंकि @ XL_ का उत्तर क्वेरी का उपयोग सूचकांक में नहीं कर सकता।
पेड्रोनामेल

2
SELECT * FROM sample_table WHERE last_visit = DATE_FORMAT('2014-11-24 10:48:09','%Y-%m-%d %H:%i:%s')

यह mysql का उपयोग करके डेटाटाइम प्रारूप के लिए है DATE_FORMAT(date,format)


1
SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29';

यह मदद करता है, आप DATEतुलना करने से पहले मानों को रूपांतरित कर सकते हैं ।


0

आप DATETIME फ़ील्ड को DATE में डाल सकते हैं:

SELECT * FROM `calendar` WHERE CAST(startTime AS DATE) = '2010-04-29'

यह बहुत कुशल है।


1
नहीं यह कुशल भी नहीं है। यदि अनुक्रमणित किया जाता है तो startTimeयह इंडेक्स का उपयोग करने में सक्षम नहीं होगा
ज़मरोनी पी। जुहारा

-6
SELECT * FROM `calendar` WHERE startTime like '2010-04-29%'

आप MySQL तारीखों पर तुलना ऑपरेटरों का उपयोग कर सकते हैं यदि आप कुछ के बाद या उससे पहले खोजना चाहते हैं। ऐसा इसलिए है क्योंकि वे इस तरह से लिखे गए हैं (अग्रणी शून्य के साथ सबसे छोटे मूल्य पर) कि एक साधारण स्ट्रिंग सॉर्ट उन्हें सही ढंग से सॉर्ट करेगा।

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