2015-10-15 6 views
5

पर ओकेकल का उपयोग '%' का उपयोग करें मेरी तालिका myTab में कॉलम startDate है, जिसमें डेटाटाइप "DATE" है। इस कॉलम में डेटा dd.mm.yyyy जैसा संग्रहीत किया जाता है। किसी तरह यह काम नहीं करताओरेकल

SELECT * FROM myTab WHERE startDate like '%01.2015" 

और मैं पता नहीं क्यों:

अब मैं इस क्वेरी के साथ डेटा प्राप्त करने की कोशिश कर रहा हूँ।

उम्मीद है कि कोई मदद कर सकता है।

+0

आप जनवरी में सभी पंक्तियों चाहते हैं 2015 उपयोग 'जहां TO_CHAR (STARTDATE, 'सोम-YYYY') = 'Jan- 2015 '; ' – Mihai

+0

देखें [DATE की ओरेकल एसक्यूएल तुलना गलत परिणाम देता है] (http://stackoverflow.com/questions/29005398/oracle-sql-comparison-of-dates-returns-wrong-result/29005418# 2 9 005418) –

उत्तर

18

उस तारीख को टेक्स्ट खोज करने के लिए आपको तिथि को टेक्स्ट में रूपांतरित करना होगा।

यदि आप जो खोजना चाहते हैं उसके लिए पहली और आखिरी तारीख की गणना करते हैं और उनके बीच सब कुछ प्राप्त करते हैं तो यह अधिक कुशल है। यही कारण है कि जिस तरह से यह एक पाठ पैटर्न मैच के बजाय संख्यात्मक तुलना के रूप में किया गया है, और अगर वहाँ एक है यह एक सूचकांक का उपयोग कर सकते हैं:

SELECT * FROM myTab WHERE startDate >= DATE '2015-01-01' AND startDate < DATE '2015-02-01' 
+0

यदि आप यह भी उल्लेख करते हैं कि ** ** ** ** दिनांक सीमा ** स्थिति का उपयोग करके मैं यहां बेहतर हूं। असल में, यह प्रदर्शन के बारे में है, यानी 'बी * ट्री इंडेक्स '(यदि कोई हो) का उपयोग। –

+0

@ ललितकुमार बी: अच्छा बिंदु। – Guffa

+0

"* इस तरह यह टेक्स्ट पैटर्न मिलान के बजाय एक सादा संख्यात्मक तुलना है *" नहीं, यह सच नहीं है, यह बिल्कुल संख्यात्मक तुलना में नहीं है। ओरेकल में ** ** ** ** ** ** ** ** पूरी तरह से अलग हैं। ' –

2

फ़ील्ड प्रकार है "DATE" तो मान के रूप में संग्रहीत नहीं है एक स्ट्रिंग, यह एक संख्या ओरेकल द्वारा प्रबंधित है, तो आप इसे एक स्ट्रिंग के लिए कनवर्ट करने के लिए है:

SELECT * FROM myTab WHERE to_char(startDate, 'MM.YYYY') = '01.2015'; 

तुम भी एसक्यूएल प्रश्नों में तिथि सीमाओं का उपयोग कर सकते हैं:

SELECT * FROM myTab 
WHERE startDate 
BETWEEN to_date('01.01.2015', 'DD.MM.YYYY') 
AND  to_date('31.01.2015', 'DD.MM.YYYY'); 
+1

कृपया अंतर्निहित डेटा रूपांतरणों के बारे में पहले पढ़ें: यहां http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements002।एचटीएम # i53062 ओरेकल स्वचालित रूप से इस मामले में एक तारीख को वर्चर में परिवर्तित कर देता है, आपका उत्तर सटीक नहीं है .. – krokodilko

+0

to_char() स्पष्ट है: http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements002। एचटीएम # एसक्यूएलआरएफ 51054 – mbk

2
SELECT * FROM myTab WHERE TO_CHAR(startDate,'dd.mm.yyyy') LIKE '%01.2015' 
+0

आपका रास्ता थोडा काम करता है। अब मुझे समस्या है कि अन्य तिथियां काम नहीं करती हैं। अगर मैं '% 01.2013' का उपयोग करने की कोशिश करता हूं तो मुझे कोई डेटा नहीं मिलता है लेकिन मुझे पता है कि इस श्रेणी में तिथियां हैं ... – Ovoxo

+0

@ ललित, क्या मैं नम्रतापूर्वक सुझाव देता हूं कि आप अपना स्वर थोड़ा आराम करें? यह जवाब "पूरी तरह गलत" नहीं है, यह सिर्फ सर्वश्रेष्ठ नहीं है। असल में, यह उत्तर * काम करेगा *, हालांकि समस्या को हल करने के बहुत से बेहतर तरीके हैं, और वास्तव में, * नहीं, वास्तव में, अंतर्निहित डेटा प्रकार रूपांतरण पर भरोसा करते हैं। –

+0

@ जेफरी, पर्याप्त मेला :-) –

1

आपको वास्तविक प्रश्न के बारे में "किसी भी तरह से यह काम नहीं करता है और मुझे नहीं पता क्यों।"

ओरेकल DATE से VARHCAR2 पर एक निहित रूपांतरण बनाते हैं, हालांकि यह डिफ़ॉल्ट NLS_DATE_FORMAT का उपयोग करता है जो आपके प्रश्न में आपके द्वारा उपयोग किए जाने वाले कार्यों के लिए शायद अलग है।

1

इस कॉलम में डेटा dd.mm.yyyy जैसे संग्रहीत हैं।

ओरेकल आपके द्वारा देखे जाने वाले प्रारूप में दिनांक संग्रहीत नहीं करता है। यह आंतरिक रूप से 7 बाइट्स में स्वामित्व प्रारूप में संग्रहीत करता है जिसमें प्रत्येक बाइट डेटाटाइम वैल्यू के विभिन्न घटकों को संग्रहीत करता है।

कहां STARTDATE '% की तरह ०१.२,०१५ "

आप एक STRING है, जो व्यर्थ है के साथ एक DATE के तुलना कर रहे हैं।

दृश्य की प्रदर्शन बिंदु से, आप चाहिए दिनांक सीमा स्थिति का उपयोग करें ताकि यदि कोई नियमित INDEX दिनांक कॉल पर है शरद ऋतु, इसका इस्तेमाल किया जाएगा।

SELECT * FROM table_name WHERE date_column BETWEEN DATE '2015-01-01' AND DATE '2015-02-01' 

को समझने के लिए क्यों एक तिथि सीमा हालतप्रदर्शन के मामले में बेहतर है, मेरा उत्तर here पर एक नजर है।

0

मैंने अपनी समस्या को हल किया। सुधार के लिए सुझावों के लिए धन्यवाद। सी # में उदाहरण।

string dd, mm, aa, trc, data; 
dd = nData.Text.Substring(0, 2); 
mm = nData.Text.Substring(3, 2); 
aa = nData.Text.Substring(6, 4); 
trc = "-"; 
data = aa + trc + mm + trc + dd; 

"Select * From bdPedidos Where Data Like '%" + data + "%'"; 
0

अधिक विस्तृत उत्तर प्रदान करने और इस https://stackoverflow.com/a/42429550/1267661 उत्तर के मुद्दे को संबोधित करने के लिए।

ओरेकल में "दिनांक" प्रकार का एक स्तंभ एक संख्या और न ही एक स्ट्रिंग है, यह वर्ष, महीना, दिन, घंटा, मिनट और सेकंड के साथ "डेटाटाइम" मान है। डिफ़ॉल्ट समय हमेशा आधी रात "00:00:00"

क्वेरी है:

Select * From bdPedidos Where Data Like '%" + data + "%'" 

सभी परिस्थितियों में काम नहीं करेगा क्योंकि एक तारीख स्तंभ एक स्ट्रिंग, नहीं है बलों "की तरह" का उपयोग ओरेकल दिनांक मान से स्ट्रिंग मान में रूपांतरण करने के लिए। स्ट्रिंग मान साल-दर-दिन या महीने-दिन-वर्ष या दिन-महीने-वर्ष-समय हो सकता है, यह सब निर्भर करता है कि एक विशेष ओरेकल उदाहरण ने स्ट्रिंग के रूप में दिनांक दिखाने के लिए पैरामीटर NLS_DATE_FORMAT को कैसे सेट किया है।

सही तरीके से एक दिन में हर संभव बार कवर करने के लिए है:

Select * 
From bdPedidos 
Where Data between to_date('" + data + " 00:00:00','yyyy-mm-dd hh24:mi:ss') 
       and to_date('" + data + " 23:59:59','yyyy-mm-dd hh24:mi:ss') 
+0

क्वेरी सी # के अंदर बनाई गई एक स्ट्रिंग है, इसलिए प्रारंभ उद्धरण और अंतिम उद्धरण की आवश्यकता है – alvalongo