2011-06-01 16 views
8

मैं वर्तमान में एक Oracle DBओरेकल मेरी स्ट्रिंग क्यों खा रहा है?

select tzname || ' (UTC'|| tz_offset(tzname) || ')' from v$timezone_names 

यह नहीं बहुत जटिल लगती है पर निम्न क्वेरी निष्पादित करने के लिए प्रयास करें। बस timzone और यूटीसी ब्रेसिज़ में ऑफसेट का नाम। लेकिन जब मैं विंडोज़ पर पीएल/एसक्यूएल डेवलपर के साथ क्वेरी निष्पादित करता हूं तो यह हमेशा अंतिम ब्रेस खाता है।

तो मैं एसक्लप्लस गया और वहां इसे निष्पादित कर दिया और अब मुझे अपनी आखिरी ब्रेस मिलती है लेकिन अतिरिक्त ब्रेस के रूप में अंतिम ब्रेस से पहले अतिरिक्त सफेद जगह भी मिलती है।

मैंने इसे नेस्टेड to_char() और trim() के साथ करने की कोशिश की है लेकिन कुछ भी नहीं बदलेगा। मैंने इसे विभिन्न डीबी पर भी कोशिश की लेकिन यह हमेशा वही है।

क्या किसी को पता है कि tz_offset और स्ट्रिंग concatenation के साथ कोई समस्या है?

+0

ऐसा लगता है कि आप इसे भूखा कर रहे हैं। इसे नियमित रूप से डेटा खिलाएं और यह उन चीज़ों को नहीं खाएगा जिनके लिए इसका मतलब नहीं है। –

+1

ओरेकल 11 जी में पुन: उत्पादित। –

उत्तर

7

निम्न क्वेरी जारी:

select dump(tz_offset(tzname)) from v$timezone_names; 

आप प्राप्त इस तरह के परिणाम:

Typ=1 Len=7: 43,48,49,58,48,48,0 
Typ=1 Len=7: 43,48,49,58,48,48,0 
Typ=1 Len=7: 43,48,49,58,48,48,0 
Typ=1 Len=7: 43,48,49,58,48,48,0 
Typ=1 Len=7: 43,48,49,58,48,48,0 
Typ=1 Len=7: 43,48,49,58,48,48,0 
... 

यह दिखाता है कि tz_offset() रिटर्न अशक्त-समाप्त तार (शायद एक बग)। आपकी क्वेरी के लिए तो, ओरेकल के बाद मन में, मुझे लगता है कि PL/SQL डेवलपर समझता है कि वह \ के रूप में अंत के स्ट्रिंग 0 (शायद एक और बग, एसक्यूएल तार अशक्त-समाप्त नहीं कर रहे हैं)

"Africa/Algiers (UTC+01:00\0)" // Note \0 -> null character 
"Africa/Cairo (UTC+03:00\0)" // Note \0 -> null character 
... 

लौटा रहा है और इसलिए यह बाकी स्ट्रिंग लिखने को परेशान नहीं करता है, इसलिए आप पिछली ब्रेस खो देते हैं। एसक्यूएल * प्लस उस नल के बजाए एक व्हाइटस्पेस मुद्रित करने के बजाय चुनता है और फिर स्ट्रिंग के बाकी हिस्सों के साथ आगे बढ़ता है, जो बंद ब्रेस प्रिंट करता है।

एक कामकाज के रूप में, आप tz_offset(...)replace(tz_offset(...), chr(0)) के साथ प्रतिस्थापित कर सकते हैं। यह tz_offset(...) रिटर्न से नल को हटा देगा।

+0

धन्यवाद, बहुत अच्छी व्याख्या! – Marcel

+0

पीएल/एसक्यूएल डेवलपर के लिए विशिष्ट बग की तरह दिखता है। ओरेकल एसक्यूएल डेवलपर \ 0 को छोटे वर्ग के रूप में दिखाता है और स्ट्रिंग में जोड़े गए किसी भी अक्षर को दिखाता है। –

+0

@ जेफरी केम्प हाँ, लेकिन मुझे लगता है कि 'tz_offset()' किसी भी मामले में शून्य-समाप्त तारों को वापस नहीं करना चाहिए। – gpeche

1

यह सबस्ट्रिंग साथ काम करता है लेकिन वह वास्तव में अपने प्रश्न क्यों यह :-) हो रहा है उत्तर नहीं मिलता है:

चयन tzname || '(यूटीसी' || सबस्ट्रेट (tz_offset (tzname), 1,6) || '' 'v $ timezone_names से;

0

मैं एक JSON ajax संसाधन है कि टाइम स्टांप समय क्षेत्र शामिल करने की ज़रूरत है कि रिटर्न का निर्माण कर रहा ऑफसेट ... कि नियंत्रण चरित्र अनुगामी वास्तव में कष्टप्रद मुझे, मैं ट्रिम अगर बंद इस प्रकार थी:

regexp_replace (tz_offset ('कनाडा/माउंटेन '),' [[: cntrl:]] ',' ')

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