2010-01-18 13 views
7

का उपयोग कर मेरे पास मौजूदा डेटा वाला एक एप्लीकेशन है, जिसमें शून्य कॉलम में शून्य है।ओरेकल शून्य तिथि

जब मैं sqlplus से इसे देख मैं देख रहा हूँ: 00-Decemb

जब मैं इस स्तंभ पर डंप फ़ंक्शन का उपयोग करें, मैं प्राप्त करें: प्रकार = 12 लेन = 7: 100,100,0,0,1 , 1,1

मैं नेट से मौजूदा डेटा (डेटा में कोई परिवर्तन नहीं, या डेटा संरचना या यहाँ तक कि मौजूदा एसक्यूएल बयान)

कैसे हैक मैं इस मूल्य पढ़ा करते हैं, या के साथ काम करने की जरूरत है इसे लिखो।

डाटाबेस संस्करण, भिन्न होता है 8 से करने के लिए 11.

सहायता

+0

कृपया कुछ स्पष्ट करें। क्या ये तिथियां पहले से ही आपके ओरेकल डेटाबेस में हैं? यदि हां, तो क्या वे वास्तव में एक दिनांक डेटाटाइप के साथ कॉलम में आयोजित किए जाते हैं? या आप उन्हें एक अलग डेटाबेस उत्पाद से आयात करने की कोशिश कर रहे हैं। – APC

+0

हाँ, ये तिथियां पहले से ही डेटाबेस में हैं। कॉलम DATE डेटाटाइप का है। – Noam

+0

जब आप .NET ऐप में पंक्ति को पढ़ते हैं जो कॉलम में दिखाई देता है? –

उत्तर

1

दिन के अंत में, मेरी समस्या का कोई समाधान नहीं था।

मैंने जो किया, जब भी व्यापार तर्क ने शून्य तिथि दर्ज करने का प्रयास किया, मैंने इसे 1/1/0001 में बदल दिया और जब कभी मुझे 1/1/0001 या डीबी से अपवाद मिला, तो मैंने व्यवहार किया व्यवसाय तर्क जैसे कि मुझे शून्य तिथि मिली है।

+0

वर्ष 10k में आपके टाइमस्टैम्प के साथ क्या होगा? ;-) –

1

बधाई सराहना की होगी, कि एक रक्षक है!

प्रकार = 12 लेन = 7: 100,100,0,0,1,1,1

कि डंप में तत्वों सदी, वर्ष, माह, दिन, घंटा मिनट दूसरे कर रहे हैं। तो क्या तुम वहाँ है 0-0-0000 पर midight है, जो निश्चित रूप से एक मान्य दिनांक नहीं है ...

SQL> create table d (d1 date) 
    2/

Table created. 

SQL> insert into d values (to_date('00-00-0000', 'dd-mm-yyyy')) 
    2/
insert into d values (to_date('00-00-0000', 'dd-mm-yyyy')) 
           * 
ERROR at line 1: 
ORA-01847: day of month must be between 1 and last day of month 


SQL> 

संपादित

मैं एक में एक शून्य की तारीख लोहदंड के लिए गैरी उत्कृष्ट चाल का इस्तेमाल किया है टेबल ....

SQL> select * from d 
    2/

D1 
--------- 
00-DECEMB 
19-JAN-10 

SQL> 

तो कम से कम हम जानते हैं कि आपके "जादू" डेवलपर्स ने यह कैसे किया। अब हमें बस अपनी चतुरता के आसपास काम करना है।

मुझे लगता है कि एक ही रास्ता यह करने के लिए - और आप शायद नहीं पसंद करने के लिए यह जा रहे हैं - एक एपीआई परत का निर्माण करने, विचारों का उपयोग है ....

SQL> create or replace view v_d as 
    2 select case when d1 = trash_date then null else d1 end as d1 
    3 from d 
    4/

View created. 

SQL> select * from v_d 
    2/

D1 
--------- 

19-JAN-10 

SQL> 

का नहीं कम से कम परेशान पहलू यह है कि आपको INSTEAD IF ट्रिगर्स की आवश्यकता होगी जो वास्तव में अंतर्निहित तालिका में शून्य तिथियां डालें (फिर, गैरी के फ़ंक्शन का उपयोग करके)। इसके अलावा, एक ही ऑब्जेक्ट नामों को बनाए रखने के लिए आपको शायद एक अलग स्कीमा में एपीआई बनाने की आवश्यकता होगी।

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

देर ब्रेकिंग न्यूज़

मैं बस जो इन हास्यास्पद दिनांकों एक वैकल्पिक व्याख्या प्रदान करता है अपने ही पर्यावरण, में इस हास्यास्पद तारीख भर में आ गए हैं। मैंने पंक्तियों वाली एक तालिका में एक DATE कॉलम जोड़ा। मैंने sysdate को डिफ़ॉल्ट मान सेट करने के लिए DEFAULT क्लॉज का उपयोग किया। अंदाज़ा लगाओ की क्या हुआ?

SQL> select * from t69 
    2/

     ID 
---------- 
     1 
     2 

SQL> alter table t69 add col2 date default sysdate not null 
    2/

Table altered. 

SQL> select * from t69 
    2/

     ID COL2 
---------- --------- 
     1 00-DECEMB 
     2 00-DECEMB 

SQL> 

रिकॉर्ड के लिए, sysdate नई पंक्तियों के लिए अपेक्षित काम करता है ...

SQL> insert into t69 (id) values (3) 
    2/

1 row created. 

SQL> select * from t69 
    2/

     ID COL2 
---------- --------- 
     1 00-DECEMB 
     2 00-DECEMB 
     3 28-APR-10 

SQL> 
+0

हां दुर्भाग्यवश मैं जादू (ईडेवेलर, यूनिपास, आदि ...) नामक एक भाषा में लिखे गए विरासत अनुप्रयोग द्वारा बनाए गए डेटाबेस के साथ काम कर रहा हूं, यह भाषा शून्य तिथि का बहुत शौकिया है - इसलिए यह स्थानीय समस्या नहीं है मेरे लिए। यह एक शो स्टॉपर है। – Noam

+0

मुझे लगता है कि मैजिक नामक एक लैगगुएज जादू मूल्यों का बहुत शौकिया होगा। लेकिन ईमानदारी से, जादू मूल्य नल से भी बदतर हैं। – APC

+0

मैं पूरी तरह से सहमत हूं - लेकिन दुर्भाग्य से मेरे लिए, यह दिया गया है – Noam

0

एपीसी के रूप में पता चला कि आप इसे एसक्यूएल * प्लस से ठीक नहीं कर सकते हैं। मैं एक जेडीबीसी अद्यतन मूल्य से एक ही समस्या में आया था।

एकमात्र समाधान जिसके साथ मैं आ सकता था, तारीख को एक समझदार (यदि अभी भी गलत) मान सेट करने के लिए पंक्ति को अद्यतन करना था - आपको प्राथमिक कुंजी का उपयोग करके पंक्ति का संदर्भ देना होगा (जिसमें प्रश्न में कॉलम शामिल नहीं है) या पंक्ति का उपयोग करें या उस तारीख पर एक अद्यतन करें जहां दिनांक कॉलम एक ही प्रकार के उपकरण का उपयोग करके वैध श्रेणी के रूप में दिखाई देता है, जिसने पहले स्थान पर खराब डेटा बनाया है (यानी एसक्यूएल * प्लस नहीं)

(ओह - और बग जो समस्या का कारण ठीक करने की कोशिश!)

HTH

सी

+0

दुर्भाग्यवश, मूल डेटा को बदलना कोई विकल्प नहीं है – Noam

+0

फिर आप टेबल पर अन्य प्रश्नों से फॉलआउट की अपेक्षा करना बेहतर शुरू करेंगे :( – symcbean

+0

मेरे पास उस तालिका पर कई प्रश्न हैं, लेकिन वे सभी डेटाएप परत के माध्यम से रूट किए गए हैं, इसलिए मैं कर सकता हूं इस मुद्दे को संबोधित करें। लेकिन मुझे एसक्यूएल या डेटा – Noam

3

सुनिश्चित नहीं है कि आप वास्तव में क्या हासिल करने की उम्मीद करते हैं, लेकिन आप DBMS_STATS.CONVERT_RAW_VALUE के माध्यम से 'क्रूडी' दिन उत्पन्न कर सकते हैं।

create or replace function stats_raw_to_date (p_in raw) return date is 
    v_date date; 
    v_char varchar2(25); 
begin 
    dbms_stats.CONVERT_RAW_VALUE(p_in, v_date); 
    return v_date; 
exception 
    when others then return null; 
end; 
/
select x, dump(x) y from (select stats_raw_to_date('64640000010101') x from dual); 

तो क्या मदद कर सकते हैं एक समारोह

create or replace function trash_date return date deterministic is 
    v_date date; 
begin 
    dbms_stats.CONVERT_RAW_VALUE('64640000010101', v_date); 
    return v_date; 
end; 
/

तो फिर तुम जैसे

select case when date_col = trash_date then null else date_col 
from table... 
+0

को बदलने के बिना उस डेटा को प्राप्त करने के लिए कुछ तरीका चाहिए। क्या आप .NET से RAW मान प्राप्त करने के तरीके के बारे में जानते हैं - एसक्यूएल को मैनिपुलेट किए बिना? – Noam

+0

पता नहीं नेट या तो मौजूदा एसक्यूएल एक तिथि देता है, जो सात बाइट्स है, या यह इसे TO_CHAR के साथ एक स्ट्रिंग में परिवर्तित करता है। यदि यह TO_CHAR का उपयोग करता है तो आप स्ट्रिंग को समझने के साथ फंस गए हैं। अगर यह ओरेकल दिनांक लौटा रहा है, तो क्या यह संभव है OracleDate की बजाय ओरेकलबाइनरी के रूप में दिनांक कॉलम का चयन करें? –

0

यह हास्यास्पद कैसे Oracle अनुकूलक आंकड़ों का उपयोग करता है के साथ क्या करना खतरनाक है उपयोग कर सकते हैं कि एक प्रश्न में है।

आपके पास एक अवैध, कृत्रिम रूप से कम दिनांक मूल्य है जो लगभग निश्चित रूप से एक पूर्ण सरोगेट के रूप में उपयोग किया जा रहा है। ओरेकल को पता नहीं है कि यह एक सामान्य सरोगेट है, केवल एक मूल्य है, इसलिए जब यह अनुकूलक आंकड़े एकत्र करता है, तो वह कॉलम के लिए कम मूल्य के रूप में उस अमान्य तिथि का उपयोग करेगा, और मान लें कि डेटा रैखिक रूप से उच्च और निम्न के भीतर वितरित किया गया है मान जो पाए जाते हैं, और डेटा का 10% कुल मूल्य से कम है और कम मूल्य से नीचे है।

यदि आपके पास शून्य (अनुपस्थित या अमान्य) डेटा है, तो तालिका में नल डेटा लिखें।

+0

दुर्भाग्यवश मेरे लिए, यह विरासत डेटा के साथ एक विरासत अनुप्रयोग है, और विरासत तर्क जो मायने रखता है इस समस्याग्रस्त मूल्य पर। – Noam

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