1994 年 6 月 20 日以降に採用された従業員数を表示するようにしようとしていますが、
Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > 31-DEC-95;
しかし、私はエラーが発生します
"JUN' 無効な識別子です。
助けてください、ありがとう!
1994 年 6 月 20 日以降に採用された従業員数を表示するようにしようとしていますが、
Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > 31-DEC-95;
しかし、私はエラーが発生します
"JUN' 無効な識別子です。
助けてください、ありがとう!
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')
この方法にはいくつかの不必要な落とし穴があります
DEC
、 は必ずしも 12 月を意味するわけではありません。NLS_DATE_LANGUAGE
それはあなたと設定に依存しNLS_DATE_FORMAT
ます。との比較がどのロケールでも確実に機能するようにするには、代わりに日時形式モデルを使用できます。 MM
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_LANGUAGE
、NLS_DATE_FORMAT
から派生しNLS_TERRITORY
ます。これらは、最初にデータベースを作成したときに設定されますが、初期化パラメーター ファイルを変更することによって (本当に必要な場合のみ)、またはALTER SESSION
構文を使用してセッション レベルで変更することができます。例えば:
alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';
これの意味は:
DD
月の数値日、1 から 31MM
数値の月、01 ~ 12 (1 月は 01 )YYYY
4 桁の年 - 私の意見では、これは常に2 桁の年よりも優れてYY
います。なぜなら、何世紀を指しているのか混乱しないからです。HH24
1 日の時間、0 から 23MI
分、0 から 59SS
秒、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
。
結論、
to_char
独自の方法で動作します
そう、
比較には、MM-DD-YYやDD-MM-YYYYなどの形式ではなく、常にこの形式YYYY-MM-DDを使用してください。
次のように 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;
日付が文字に変換されるため、一重引用符が必要です。
employee_id、count(*) を選択 従業員から どこ to_char(employee_date_hired, 'DD-MON-YY') > '31-DEC-95';