1

OCA 認定資格の質問を確認したところ、何かが間違っていることに気付きました。彼らが聞く:

全ユーザーからの採用時期(人事ユーザー)を昇順に記入してください

そこで、次のクエリを書きました。

SELECT employee_id, first_name, last_name, hire_date
  FROM employees 
 WHERE hire_date BETWEEN '01/01/80' AND '01/01/99'
 ORDER BY hire_date;

そのデータタイムが正しくないため、instructoeはそれが間違っていると言います! それは「01-JAN-80」である必要があります。何?これが信じられない!

ラップトップにデータベースをインストールしていませんが、前回の作業でこのクエリを数回実行したことは確かで、データ形式は/and ではありません-

どんな提案でも大歓迎です。

アップデート

xe 10gでテストしたところ、間違いなくそうでは/ありません-

http://imageshack.us/photo/my-images/28/truethat.jpg/ ()

4

2 に答える 2

4

あなたもあなたのインストラクターも正しくありません。あなたのどちらかがたまたま正しいかもしれません。

日付を文字列と比較する場合、Oracle は文字列を日付に変換する必要があります。そのために、セッションの current を使用しNLS_DATE_FORMATます。クライアントが異なれば、デフォルトNLS_DATE_FORMATも異なります。地域が異なれば、異なるデフォルト形式が使用され、個人によって異なる形式が好まれます。暗黙的な変換に依存している場合、セッションNLS_DATE_FORMATが期待と一致しない場合は常にコードが失敗します。そして必然的に、それはコードが最も不適切なタイミングで失敗することを意味します。

日付を文字列と比較する代わりに、常に日付と日付を比較する必要があります。Oracle でこれを行うには 2 つの方法があります。TO_DATEまず、適切なフォーマット文字列で明示的に使用できます。

SELECT employee_id, first_name, last_name, hire_date
  FROM employees 
 WHERE hire_date BETWEEN to_date('01/01/80','mm/dd/rr') AND to_date('01/01/99','mm/dd/rr')
 ORDER BY hire_date;

次に、ANSI 日付リテラルを使用できます。ANSI 日付リテラルは常に次の形式を使用しますYYYY-MM-DD

SELECT employee_id, first_name, last_name, hire_date
  FROM employees 
 WHERE hire_date BETWEEN date '1980-01-01' AND date '1999-01-01'
 ORDER BY hire_date;
于 2012-04-16T02:12:39.423 に答える
3

個人的には、暗黙の変換には依存していません。多くの場合、これは予期せぬ悲しみにつながります。日付範囲間のフィルターを提供するように求められた場合、私ははっきりと答えます。任意の形式を選択しますが、混乱を招く可能性がある場合は、可能な限り混乱を排除するようにしてください。

SELECT employee_id, first_name, last_name, hire_date
  FROM employees 
  WHERE hire_date BETWEEN TO_DATE('JAN-01-1980', 'MON-DD-YYYY')
                      AND TO_DATE('JAN-01-1999', 'MON-DD-YYYY')
  ORDER BY hire_date;
于 2012-04-16T00:53:12.347 に答える