0

私の質問は、5番目のコマンドに関係しています。

  1. create ex_table(on_date date);

  2. insert into ex_table values(to_date('23-aug-75','dd-mm-rr'));

  3. insert into ex_table values(to_date('23-aug-75','dd-mm-yy'));

上記の 3 つのコマンドを適用した後 (2015 年に実行):

  1. select to_char(on_date,'dd-mm-yyyy') from ex_table;

結果:

on_date
-------
23-aug-1975
23-aug-2075
  1. select to_char(on_date,'dd-mm-yyyy') from ex_table where on_date='23-aug-75';

結果:

on_date
-------
23-aug-1975

5 番目のコマンドの結果が23-aug-1975、そうでない23-aug-2075、またはその両方である理由は何ですか?

コマンド#2が実行されない場合、結果には間違いなく23-aug-2075.

4

2 に答える 2

2

あなたがするとき

where on_date='23-aug-75'

それは実際にそれを次のように翻訳しています:

where on_date=to_date('23-aug-75') -- without the fmt parameter.

形式が明示的に指定されていないため、文字列が解析され、現在のnls_date_formatセッション値に従って日付に変換されます。おそらく、あなたのセッション値はDD-MON-RRです。次のクエリを実行して確認できます。

select value
from nls_session_parameters
where parameter = 'NLS_DATE_FORMAT';

その場合、The RR Datetime Format Element75のドキュメントでは、現在の日付が2015次の場合に文字列の年がどのように決定されるかを説明しています。

指定された 2 桁の年が 50 から 99 の場合、[...] 現在の年の下 2 桁が 00 から 49 の場合、返される年の上 2 桁は、年の上2 桁よりも1 少なくなります。現在の年。

したがって、条件を適用するときに上記のルールを適用します。

where on_date='23-aug-75'

...次に、1975 年 8 月 23 日の日付を探しています。

あなたの質問では、次のようにも言っています。

コマンド#2が実行されない場合、結果には間違いなく23-aug-2075.

私はその声明に反対しなければなりません。セッションnls_date_format値をDD-MON-YY.

それが説明です。しかし、ベスト プラクティスとしては、使用している日付形式を常に明示し、常に 4 桁の年形式を使用するか、YYYY-MM-DD非常に明確で使いやすい ISO 形式を使用して、あいまいさを完全に回避しないでください。

于 2015-07-23T19:23:52.890 に答える
0

RR は Century を表し、YY は Year を表します

sstan が提案するように、データベースの日付形式を確認できます。

こんな感じで覚えました。

ルール 1 :

現在の年が 00 ~ 49 で、00 ~ 49 の値を指定した場合、世紀に変化はありません。つまり、2015 年が現在の年で、値 30 を渡すと、30 は 2030 年と解釈されます。

ルール 2 :

現在の年が 00 ~ 49 で、50 ~ 99 の値を指定した場合、世紀は 1 を引いたものになります。つまり、2015 年が現在の年で、値 75 を渡すと、75 は 1975 年と解釈されます。

ルール 3 :

現在の年が 50 ~ 99 で、00 ~ 49 の値を指定すると、世紀は世紀 + 1 になります。つまり、現在の年が 2060 で、値 23 を指定すると、2161 と解釈されます。

ルール 4 :

現在の年が 50 ~ 99 で、50 ~ 99 の値を指定した場合、世紀は変わりません。つまり、現在の年が 2060 年で、値 56 を指定した場合、2056 と解釈されます。

于 2015-07-23T20:47:04.407 に答える