1. ホーム
  2. oracle

[解決済み] ORACLEのTO_DATE関数

2022-03-12 04:39:34

質問

を試していたのですが TO_DATE 関数を使用します。具体的には、以下のようなクエリに注目しました。

1. SELECT TO_CHAR(TO_DATE('01-01-2015','DD-MM-YYYY'),'DD-MON-YY') FROM DUAL
2. SELECT TO_DATE('01-01-2015','DD-MM-YYYY') FROM DUAL

は同じ出力になります。 01-JAN-2015 .

なぜ TO_DATE 関数は月を省略した形で返すのですか? 2番目のクエリで期待される出力は次のようなものです。 01-01-2015 (単純に、TYPE変換であって、フォーマット変換ではない)。

私が間違っているのでしょうか?

ありがとうございます。

解決方法は?

日付には書式がなく、次のように表されます。 7バイトまたは8バイト .

SELECT DUMP( SYSDATE ) FROM DUAL;

出力されるかもしれません。

Typ=13 Len=8: 220,7,11,26,16,41,9,0

このフォーマットはコンピュータが日付を比較するのには非常に便利ですが、人間にとってはあまり便利ではありません。そのため、SQLクライアント(SQL/plus、SQL Developers、TOADなど)が日付を表示する際には、バイトを表示せず、文字列として表示されます。

これを実現するために、暗黙のうちに TO_CHAR() (あるいは日付を文字列化する他の内部メソッド) を使用し、デフォルトのフォーマットマスクを使用してこの変換を実行します。

SQL/Plus と SQL Developer は、ユーザーのセッションパラメータである NLS_DATE_FORMAT を使用して、この変換を実行します。 この回答 に関してです。

つまり、2つ目のクエリは、暗黙のうちにこれに近いことをするように変換されているのです(ただし、ほぼ確実に、より効率的です)。

SELECT TO_CHAR(
         TO_DATE('01-01-2015','DD-MM-YYYY'),
         ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
       )
FROM   DUAL