2016-12-10 24 views
0

日付を格納するためにvarchar型を使用しているソースアプリケーションがあります。すべての日付はyyyymmdd形式になっています。だから今Oracle to_dateエラー

、私はこのクエリ

select (case when PLE_DATE = '00000000' then null else to_date(PLE_DATE,'yyyymmdd') end) PLE_DATE 
from PLE_DATE_TAB 

を実行したときに、私は完全に罰金のsqldeveloperからのデータを見ることができますよ。しかし、私はこのデータを日付の列としてターゲットを持つ別のテーブルに挿入しようとしています。月の最初の日と最後の日の間にエラーが発生していなければなりません。私はこれを把握するのに苦労している 。どんな助けも大歓迎です。ソース表とターゲット表の両方がoracle dbにあります。

+3

**日付を格納するvarchar型**なぜですか?なぜ 'Timestamp'や' date'データ型ではないのですか? –

+0

'PLE_DATE'カラムにあるデータを表示してください。 –

+0

これは良い質問です。私はそのいくつかのレガシーアプリケーションは、彼らがvarchar形式で日付を格納するために使用していると思います。この場合、私は選択肢がありませんが、私が持っているものに対処する。 – user1751356

答えて

0

データは実際に'yyyymmdd'形式であることを前提とします。 (この日付文字列が正確に8文字でないか、または数字以外の文字列を含むすべての行を選択する簡単なクエリを書くことができますが、それらの可能性は、エラーメッセージではなくエラーメッセージになります)。 「悪い日付」のためにあなたは、このような何かを行うことができます:

select ple_date from ple_date_tab 
where to_number(substr(ple_date, 7, 2)) = 31 
    and to_number(substr(ple_date, 5, 2)) in (2, 4, 6, 9, 11) 
; 

あなたはすべて2月29日の日付と、それは閏年だことを確認するために今年のチェックを見つけることが似た何かを書くことがあります。あるいは、01またはそれ以上の日の代わりに00に等しい日、または任意の月に31を超える日を検索することもできます(WHERE条件の2番目の部分は必要ありません)。

これは役に立ちませんでしたが、私たちは他のことについて考えることができますが、これが私が最初にチェックするものです(受け取ったエラーメッセージに基づいています)。

1

は、その後、あなたの選択でそれを使用

Create function Junk_to_date(junk in VARCHAR2) return date as 

Begin 

Return to_date(junk,'yyyymmdd'); 
Exception 
    When others then 
     Return null ; 
End; 

機能を記述します。

Select Junk_to_date(PLE_DATE) 
From...