166

1994 年 6 月 20 日以降に採用された従業員数を表示するようにしようとしていますが、

Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > 31-DEC-95; 

しかし、私はエラーが発生します

"JUN' 無効な識別子です。

助けてください、ありがとう!

4

5 に答える 5

336

31-DEC-95は文字列ではありません20-JUN-94。それらは、最後にいくつかの余分なものが追加された数字です。これは'31-DEC-95'orである必要があります'20-JUN-94'- 一重引用符 . に注意してください'。これにより、文字列の比較が可能になります。

ただし、文字列の比較は行っていません。日付の比較を行っています。文字列を日付に変換する必要があります。組み込みTO_DATE()関数を使用するか、日付リテラルを使用します。

現在まで()

select employee_id
  from employee
 where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')

この方法にはいくつかの不必要な落とし穴があります

  • コメントに a_horse_with_no_name が記載されているようにDEC、 は必ずしも 12 月を意味するわけではありません。NLS_DATE_LANGUAGEそれはあなたと設定に依存しNLS_DATE_FORMATます。との比較がどのロケールでも確実に機能するようにするには、代わりに日時形式モデルを使用できます。 MM
  • '95 年は不正確です。1995 年のことを言っているのはわかりますが、それが 1950 年だったとしたら、それは 1950 年ですか、それとも 2050 年ですか? 明示的であることが常に最善です
select employee_id
  from employee
 where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')

日付リテラル

日付リテラルは ANSI 標準の一部であるため、Oracle 固有の関数を使用する必要はありません。リテラルを使用する場合は、形式で日付を指定する必要YYYY-MM-DDがあり、時間要素を含めることはできません。

select employee_id
  from employee
 where employee_date_hired > date '1995-12-31'

Oracle の日付データ型には時刻要素が含まれているため、時刻部分のない日付は と同等であることに注意して1995-12-31 00:00:00ください。

時間部分を含めたい場合は、次の形式のタイムスタンプ リテラルを使用する必要があります。YYYY-MM-DD HH24:MI:SS[.FF0-9]

select employee_id
  from employee
 where employee_date_hired > timestamp '1995-12-31 12:31:02'

さらに詳しい情報

NLS_DATE_LANGUAGEから派生しNLS_LANGUAGENLS_DATE_FORMATから派生しNLS_TERRITORYます。これらは、最初にデータベースを作成したときに設定されますが、初期化パラメーター ファイルを変更することによって (本当に必要な場合のみ)、またはALTER SESSION構文を使用してセッション レベルで変更することができます。例えば:

alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';

これの意味は:

  • DD月の数値日、1 から 31
  • MM数値の月、01 ~ 12 (1 月は 01 )
  • YYYY4 桁の年 - 私の意見では、これは常に2 桁の年よりも優れてYYいます。なぜなら、何世紀を指しているのか混乱しないからです。
  • HH241 日の時間、0 から 23
  • MI分、0 から 59
  • SS秒、0 ~ 59

クエリを実行すると、現在の言語と日付の言語設定を確認できます。クエリV$NLS_PARAMETERSsを実行すると、有効な値の全範囲を確認できますV$NLS_VALID_VALUES

参考文献


ちなみに、count(*)必要な場合はグループ化する必要がありますemployee_id

select employee_id, count(*)
  from employee
 where employee_date_hired > date '1995-12-31'
 group by employee_id

これにより、あたり のカウントが得られますemployee_id

于 2012-04-16T16:54:32.237 に答える
5

結論、

to_char独自の方法で動作します

そう、

比較には、MM-DD-YYDD-MM-YYYYなどの形式ではなく、常にこの形式YYYY-MM-DDを使用してください。

于 2014-11-11T11:57:21.697 に答える
4

次のように trunc と to_date を使用できます。

select TO_CHAR (g.FECHA, 'DD-MM-YYYY HH24:MI:SS') fecha_salida, g.NUMERO_GUIA, g.BOD_ORIGEN, g.TIPO_GUIA, dg.DOC_NUMERO, dg.* 
from ils_det_guia dg, ils_guia g
where dg.NUMERO_GUIA = g.NUMERO_GUIA and dg.TIPO_GUIA = g.TIPO_GUIA and dg.BOD_ORIGEN = g.BOD_ORIGEN
and dg.LAB_CODIGO = 56 
and trunc(g.FECHA) > to_date('01/02/15','DD/MM/YY')
order by g.FECHA;
于 2015-02-03T22:24:13.307 に答える
-4

日付が文字に変換されるため、一重引用符が必要です。

employee_id、count(*) を選択
従業員から
どこ to_char(employee_date_hired, 'DD-MON-YY') > '31-DEC-95';
于 2014-06-19T06:44:09.887 に答える