2017-08-15 6 views
1

'dd-mm-yy'がの場合、比較、挿入中に暗黙的にデータ型に変換されますが、算術演算では変換されません。内部変換が可能なのになぜsysdate-wouldd-mm-yyy 'が有効でないのですか?

sysdate>'01-01-17' //is valid 
sysdate-'01-01-17' //is in valid 

まず、演算子(+、 - 、..)は数値データ型のみであると仮定しました。後で私はこれらの演算子がDate Arithmeticでも使用され、Dateデータ型のオペランドも有効であることを知っておく必要があります。

「算術演算の際に文字と文字以外のデータ型間の比較、Oracleは必要に応じて、数値、日付、またはROWIDに任意の文字データ型から変換」 - doc

to_dateを使用することで問題を解決します。暗黙のうちに変換されていない理由を探しています。

答えて

2

暗黙の変換を無視します。明示的な日付リテラルを使用して日付を表現してください:

sysdate > date '2017-01-01' 
sysdate - date '2017-01-01' 

コードは明確であいまいではありません。

なぜ、オラクルは2番目のケースで暗黙の変換を行わないのかについてです。オラクルは、どのようなタイプを期待しているのかわかりません2番目のオペランドは、日付または数値のいずれかである可能性があるため、文字列の変換方法はわかりません。最初のケースでは、比較は日付にする必要があります。

+0

私は暗黙の変換を許可しない同様の理由を想定していました。 –

0

Gordon Lindoffの回答の詳細を例に追加します。

sysdate>'010117'の間に '010117'の日付と比較すると、必ず日付であり、暗黙的に変換されます。挿入中も同じです。

しかし、sysdate-'010117'の間、システムはNumberまたはDateに変換する可能性があり、Numberに変換することを選択します。したがって、このコンテキストでは'dd-mm-yy'形式が数値に変換されます。

関連する問題