11

これを実行しているとき、文字列列COL1があります

SELECT TO_CHAR(TO_DATE(COL1,'dd-mon-yy'), 'mm/dd/yyyy')
FROM TABLE1

COL1のデータはdd-mon-yyにあります。例:27-11-89および89は1989ですが、selectはそれを11/27/2089として返します。

内部TO_DATEを実行する必要があります。実行しないと、無効な番号エラーが発生します(ORA-01722:無効な番号)

2089ではなく1989をどのように表示できますか?助けてください

4

5 に答える 5

30

COL1のデータはdd-mon-yyにあります

いいえ、ちがいます。DATE列には形式がありません。表示するときに、SQLクライアントによってその表現に(暗黙的に)変換されるだけです。

COL1が実際にDATE使用されている列である場合、文字列をDATEに変換するto_date()ため、COL1は役に立ちません。to_date()

to_char()だけが必要で、他には何も必要ありません。

SELECT TO_CHAR(col1, 'mm/dd/yyyy') 
FROM TABLE1

あなたの場合、呼び出しはを文字値にto_date()変換しDATE(デフォルトのNLS形式を適用)、それをDATEに変換し直します。この二重の暗黙の変換により、途中で一部の情報が失われます。


編集

したがって、日付を文字列に格納するという大きな間違いを犯しました。そしてそれがあなたが今問題を抱えている理由です。

最良の(そして正直に言うと、賢明な)解決策は、その列をに変換することDATEです。次に、暗黙的なデータ型変換を気にすることなく、値を任意の表現に変換できます。

しかし、おそらく答えは「私はこのモデルを継承しました。それに対処する必要があります」(常に、間違ったデータ型を選択する責任は誰にもありません)ので、RR代わりに使用する必要がありYYます。

SELECT TO_CHAR(TO_DATE(COL1,'dd-mm-rr'), 'mm/dd/yyyy')
FROM TABLE1

トリックを行う必要があります。また、例として、「単語」(NOVなど)ではなく、その月の数字が含まれるように変更monしたことに注意してください。mm27-11-89

詳細については、マニュアルを参照してください:http: //docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements004.htm#SQLRF00215

于 2012-11-27T19:28:43.857 に答える
1

これを試して。オラクルには、千年紀を区別するためのこの機能があります。

あなたが述べたように、あなたの列がvarcharである場合、以下のクエリはあなたに1989をもたらします。

table1からto_date(column_name、'dd / mm / rr')を選択します。

形式rrが年に使用される場合、次のことがoracleによって実行されます。

rr->00から49の場合--->結果は2000-2049になり、rr->50から99の場合--->結果は1950-1999になります

于 2012-11-28T03:56:01.130 に答える
0

列のタイプがDATEの場合(あなたが言うように)、最初に文字列に変換する必要はありません(実際、最初に暗黙的に文字列に変換し、次に明示的に日付に変換し、再び明示的に文字列に変換します) )::

SELECT TO_CHAR(COL1, 'mm/dd/yyyy') FROM TABLE1

列に表示される日付形式は、使用しているツール(TOAD、SQL Developerなど)とその言語設定の成果物です。

于 2012-11-27T19:29:25.230 に答える
0

もう1つの注意点は、日付をmm / dd / yyyyで変換しようとしていることですが、この変換された日付を他の日付と比較する計画がある場合は、to_charが文字通りであるため、必ずyyyy-mm-dd形式で変換してください。それを文字列に変換し、他の形式では望ましくない結果が得られます。詳細については、次のとおりです 。OracleSQLでの日付の比較

于 2014-11-16T18:27:06.453 に答える
0
SELECT * from 
(SELECT TO_CHAR(COL1, 'yyyy-MM-dd') as col1 FROM TABLE1
) T
WHERE col1 ='2021-11-12'
于 2021-11-12T08:05:07.170 に答える