मैं एसओ पर एसक्यूएल सवालों के जवाब देने में बहुत समय बिताता हूं। मैं अक्सर इस ilk के प्रश्नों पर आता हूँ:
SELECT * FROM person WHERE birthdate BETWEEN '01/01/2017' AND '01/03/2017'
SELECT * FROM person WHERE birthdate BETWEEN '2017-01-01' AND '2017-03-01'
SELECT * FROM person WHERE birthdate BETWEEN 'some string' AND 'other string'
यानी या तो दिए गए मापदंडों के स्ट्रिंग से तारीख (खराब) पर निहित रूपांतरण पर निर्भर है, या डेटाबेस पर निर्भर x मिलियन डेटाबेस पंक्ति मानों को स्ट्रिंग करने और स्ट्रिंग तुलना (बदतर) करने के लिए
मैं कभी-कभी एक टिप्पणी करता हूं, खासकर अगर यह एक उच्च प्रतिनिधि उपयोगकर्ता है जो एक स्मार्ट उत्तर लिखता है, लेकिन जिन्हें मैं वास्तव में महसूस करता हूं उन्हें कम मैला / कड़ाई से उनके डेटा प्रकारों के साथ टाइप किया जाना चाहिए
टिप्पणी आमतौर पर यह रूप लेती है कि यह शायद बेहतर होगा यदि वे स्पष्ट रूप से अपने तार को तारीखों में बदल दें, to_date (Oracle), str_to_date (MySQL), कन्वर्ट (SQLSERVER) या कुछ समान तंत्र का उपयोग कर:
--oracle
SELECT * FROM person WHERE birthdate BETWEEN TO_DATE('20170101', 'YYYYMMDD') AND TO_DATE('20170301', 'YYYYMMDD')
--mysql
SELECT * FROM person WHERE birthdate BETWEEN STR_TO_DATE('20170101', '%Y%m%d') AND STR_TO_DATE('20170301', '%Y%m%d')
--SQLS, ugh; magic numbers
SELECT * FROM person WHERE birthdate BETWEEN CONVERT(datetime, '20170101', 112) AND CONVERT(datetime, '20170301', 112)
ऐसा करने के लिए मेरा तकनीकी औचित्य यह है कि यह तारीख के प्रारूप के रूप में स्पष्ट है, और यह सुनिश्चित करता है कि कुछ स्रोत पैरामीटर निश्चित रूप से लक्ष्य स्तंभ का डेटाटाइप बन सकते हैं। यह किसी भी संभावना को रोकता है कि डेटाबेस को एक अंतर्निहित रूपांतरण गलत मिलेगा (बहुत पहले उदाहरण के 3 जनवरी / 1 मार्च तर्क) और यह डीबी को तालिका में एक लाख दिनांक मानों को स्ट्रिंग में बदलने का निर्णय लेने से रोकता है (कुछ सर्वर विशिष्ट तिथि का उपयोग करके) तुलना करने के लिए प्रारूपण स्ट्रिंग वर्ग में तारीख मानकों के प्रारूप से मेल नहीं खा सकता है) - भयावह घाव
ऐसा करने के लिए मेरा सामाजिक / शैक्षणिक औचित्य यह है कि एसओ एक सीखने की जगह है; इस पर लोग या तो स्पष्ट रूप से या स्पष्ट रूप से ज्ञान प्राप्त करते हैं। उत्तर के रूप में इस क्वेरी के साथ एक नौसिखिया हिट करने के लिए:
SELECT * FROM person WHERE birthdate BETWEEN '2017-01-01' AND '2017-03-01'
उन्हें यह सोचने के लिए प्रेरित कर सकता है कि यह समझदार है, कुछ प्रारूप के लिए तारीख को समायोजित करना जो वे पसंद करते हैं:
SELECT * FROM person WHERE birthdate BETWEEN '01/01/2017' AND '01/03/2017'
यदि उन्होंने तिथि को परिवर्तित करने के लिए कम से कम कुछ स्पष्ट प्रयास देखे, तो वे इसे अपने अजीब तिथि प्रारूप के लिए करना शुरू कर सकते हैं, और कुछ उठने से पहले उन्हें हमेशा के लिए मार सकते हैं। आखिरकार, हम (आई) लोगों को एसक्यूएल इंजेक्शन की आदत में शामिल होने से रोकते हैं और उन्हें रोकते हैं (और क्या कोई क्वेरी की वकालत कर सकता है और फिर ड्राइवर को घोषित कर सकता है कि @pBirthdate
यह एक स्ट्रिंग है, जब फ्रंटेंड में डेटाइम प्रकार है?)
मेरी सिफारिश करने के बाद क्या होता है: मुझे आमतौर पर "स्पष्ट होना, एक्स का उपयोग करना" जैसी कुछ सिफारिशें मिलती हैं, जैसे "हर कोई इसे करता है", "यह हमेशा मेरे लिए काम करता है", "मुझे कुछ मैनुअल या संदर्भ डॉक्टर दिखाएं यह कहता है कि मुझे स्पष्ट होना चाहिए "या" क्या ?? "
मैंने इनमें से कुछ के जवाब में पूछा है कि क्या वे WHERE age = '99'
एक स्ट्रिंग के रूप में उम्र को पार करके एक अंतर स्तंभ की खोज करेंगे। "मूर्ख मत बनो, हमें 'int खोजते समय' डालने की आवश्यकता नहीं है" प्रतिक्रिया आती है, इसलिए उनके दिमाग में कहीं न कहीं विभिन्न डेटा प्रकारों के लिए कुछ प्रशंसा होती है, लेकिन शायद तार्किक छलांग के लिए कोई संबंध नहीं है जो एक इंट की खोज कर रहा है एक स्ट्रिंग (जाहिरा तौर पर मूर्खतापूर्ण) पास करके और एक स्ट्रिंग (जाहिरा तौर पर समझदार) पास करके एक तारीख स्तंभ की खोज करना पाखंड है
इसलिए हमारी एसक्यूएल में हमारे पास चीजों को संख्याओं के रूप में लिखने का एक तरीका है (संख्याओं का उपयोग करें, बिना सीमांकक के), स्ट्रिंग स्ट्रिंग्स के रूप में चीजें (एपोस्ट्रोफी डेलिमिटर के बीच कुछ भी उपयोग करें) .. तारीखों के लिए कोई सीमांकक क्यों नहीं? यह अधिकांश डीबी में ऐसा मौलिक डेटा प्रकार है? क्या यह पूरी बात शायद हल हो सकती है जिस तरह से एक तारीख लिखने का एक तरीका है, उसी तरह से जावास्क्रिप्ट हमें /
कुछ वर्णों के दोनों ओर लगाकर एक रीजेक्स निर्दिष्ट करने देता है । /Hello\s+world/
। तारीखों के लिए कुछ क्यों नहीं है?
वास्तव में, मेरे ज्ञान के लिए, (केवल) Microsoft Access में वास्तव में प्रतीक हैं जो इंगित करते हैं कि "इन सीमांकक के बीच एक तारीख लिखी गई है" इसलिए हम एक अच्छा शॉर्टकट प्राप्त कर सकते हैं, WHERE datecolumn = #somedate#
लेकिन दिनांक प्रस्तुति अभी भी समस्याओं को देने के लिए उत्तरदायी है जैसे mm / di बनाम dd / एमएम, क्योंकि एमएस ने हमेशा तेजी से और ढीले खेले हैं और वीबी भीड़ के सामान के साथ एक अच्छा विचार था
मुख्य बिंदु पर वापस: मैं तर्क दे रहा हूं कि इस माध्यम से स्पष्ट होना बुद्धिमानी है जो हमें विभिन्न डेटाटाइप्स की एक स्ट्रिंग्स के रूप में पारित करने के लिए मजबूर करता है ।।
क्या यह वैध दावा है?
क्या मुझे यह धर्मयुद्ध जारी रखना चाहिए? क्या यह एक वैध बिंदु है कि सख्ती से टाइप करना आधुनिक नहीं-नहीं है? या क्या हर आरडीबीएमएस (प्राचीन संस्करणों सहित) वहां से बाहर निकलता है, जब एक क्वेरी जोर से WHERE datecolumn = 'string value'
निश्चित रूप से सही ढंग से स्ट्रिंग को एक तिथि में परिवर्तित करती है और तालिका डेटा को परिवर्तित किए बिना खोज करती है / अनुक्रमित का उपयोग खो रही है? मुझे संदेह है कि कम से कम ओरेकल के व्यक्तिगत अनुभव से 9. मुझे यह भी संदेह है कि कुछ दूर-दूर के परिदृश्य हो सकते हैं यदि तार हमेशा कुछ आईएसओ मानक प्रारूप में लिखे जाते हैं, और कॉलम कुछ दिनांक स्वाद है, तो स्ट्रिंग पैरामीटर हमेशा सही ढंग से अंतर्निहित रूप से रूपांतरित होगा। क्या यह सही है?
क्या यह एक सार्थक कार्य है?
बहुत से लोग इसे प्राप्त नहीं करते हैं, या इसकी परवाह नहीं करते हैं, या कुछ पाखंड का प्रदर्शन करते हैं कि उनके पैर की उंगलियों में छेद हैं, लेकिन उनकी तारीखें तार हैं .. आम तौर पर हालांकि कुछ लोगों ने कभी चक्कर लगाया और कहा कि "आप जानते हैं" क्या, मैं आपकी बात से सहमत हूं। मुझे अब से अपनी तारीखों के बारे में स्पष्ट हो जाएगा।
WHERE age = '0x0F'
एक उम्मीद है कि एक डेटाबेस पंद्रह साल के बच्चों की खोज करेगा।
WHERE datecolumn =
01/02 / 12'` के साथ समस्याओं को देखा है, जहां यह संभव है कि वे वर्ष 1912, 2012, 2001, 1901, 12 या 1. के लिए पूछ रहे हैं। यह डेटाबेस की दुनिया के बाहर भी एक समस्या है, संख्या प्रोग्रामर जो समझ नहीं पा रहे हैं कि"09"
इंट में कन्वर्ट होने के कारण दुर्घटना क्यों होती है, लीजन 9