मैं इसके बजाय डिज़ाइन समस्या को ठीक कर दूंगा समाधान पर समय बर्बाद करने के बजाय एक स्थायी समाधान के रूप में।
सबसे पहले, कभी नहीं स्टोर दिनांक VARCHAR2 . के रूप में . यह सब ओवरहेड इस तथ्य के कारण है कि आपका डिज़ाइन त्रुटिपूर्ण है .
<ब्लॉकक्वॉट>'20100231'
पृथ्वी पर यह कैसे एक वैध तिथि हो सकती है? फरवरी में किस कैलेंडर में 31 दिन होते हैं?
इन चरणों का पालन करें:
- दिनांक डेटा प्रकार के साथ एक नया कॉलम जोड़ें।
- TO_DATE . का उपयोग करके पुराने कॉलम के दिनांक मानों के साथ नया कॉलम अपडेट करें ।
- नए DATE कॉलम पर आवश्यक DATE अंकगणित करें, या इसे चरण 2 में ही UPDATE स्टेटमेंट में हैंडल करें।
- पुराना कॉलम छोड़ें।
- नए कॉलम का नाम बदलकर पुराने कॉलम कर दें।
अपडेट करें एक डेमो जोड़ना
सेटअप
SQL> CREATE TABLE t
2 (ymd varchar2(8));
Table created.
SQL>
SQL> INSERT ALL
2 INTO t (ymd)
3 VALUES ('20101112')
4 --INTO t (ymd)
5 -- VALUES ('20100231')
6 INTO t (ymd)
7 VALUES ('20150101')
8 INTO t (ymd)
9 VALUES ('20160101')
10 SELECT * FROM dual;
3 rows created.
SQL>
SQL> COMMIT;
Commit complete.
SQL>
नया कॉलम जोड़ें:
SQL> ALTER TABLE t ADD (dt DATE);
Table altered.
SQL>
आवश्यक अपडेट करें
SQL> UPDATE t
2 SET dt =
3 CASE
4 WHEN to_date(ymd, 'YYYYMMDD') > SYSDATE
5 THEN NULL
6 ELSE to_date(ymd, 'YYYYMMDD')
7 END;
3 rows updated.
SQL>
SQL> COMMIT;
Commit complete.
SQL>
आइए जांचें:
SQL> SELECT * FROM t;
YMD DT
-------- ---------
20101112 12-NOV-10
20150101 01-JAN-15
20160101
SQL>
पुराना कॉलम छोड़ें:
SQL> ALTER TABLE t DROP COLUMN ymd;
Table altered.
SQL>
नए कॉलम का नाम बदलकर पुराने कॉलम के नाम पर रखें
SQL> ALTER TABLE t RENAME COLUMN dt TO ymd;
Table altered.
SQL>
आपने अभी-अभी समस्या का समाधान किया है
SQL> SELECT * FROM t;
YMD
---------
12-NOV-10
01-JAN-15
SQL>