0

19.02.2013、29-03-2013、30/12/2013 などのさまざまな形式の varchar2 の日付を含む列があります。しかし、最も厄介なのは 20130713 (2013 年 7 月 13 日) であり、これを dd-mm-yyyy または dd-mon-yyyy に変換したいと考えています。

4

3 に答える 3

3

データ型に関するコメントは真実ですが、現在の問題の解決にはあまり役立ちません。to_date と to_char の組み合わせが機能する場合があります。

update yourtable
set yourfield = to_char(to_date(yourfield, 'yyyymmdd'), 'dd-mm-yyyy')
where length(yourfield) = 8
and yourfield not like '%-%'
and yourfield not like '%.%'
于 2013-07-31T12:59:05.727 に答える
3

列にこれらのさまざまな形式がすべて含まれている場合は、それぞれに対処する必要があります。質問に既知のすべての形式が含まれていると仮定すると、いくつかのオプションがあります。

to_char/to_date を使用できます。ソース データが有効な日付でない場合、SQL エラーが発生するため、これは危険です (もちろん、エラーを取得することは、不適切なデータを表示するよりも望ましい場合があります)。

または、フォーマットに基づいて文字列内の文字を単純に並べ替えることができます。これは実装が少し簡単で、区切り文字が何であるかは気にしません。

方法 1:

   case when substr(tempdt,3,1)='.'
        then to_char(to_date(tempdt,'dd.mm.yyyy'),'dd-mm-yyyy')
        when substr(tempdt,3,1)='-'
        then tempdt
        when length(tempdt)=8
        then to_char(to_date(tempdt,'yyyymmdd'),'dd-mm-yyyy')
        when substr(tempdt,3,1)='/'
        then to_char(to_date(tempdt,'dd/mm/yyyy'),'dd-mm-yyyy')

方法 2:

case when length(tempdt)=8
     then substr(tempdt,7,2) || '-' || substr(tempdt,5,2) || '-' || substr(tempdt,1,4)
     when length(tempdt)=10
     then substr(tempdt,1,2) || '-' || substr(tempdt,4,2) || '-' || substr(tempdt,7,4)
end

ここで SQLFiddle

于 2013-07-31T13:53:22.240 に答える