31-DEC-95 文字列ではなく、20-JUN-94でもありません 。それらは、最後にいくつかの余分なものが追加された数字です。これは'31-DEC-95'である必要があります または'20-JUN-94' -一重引用符'に注意してください 。これにより、文字列の比較が可能になります。
ただし、文字列の比較は行っていません。 日付の比較を行っています 。文字列を日付に変換する必要があります。組み込みのTO_DATE()を使用するか 関数、または日付リテラル。
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年を意味していることを知っていますが、それが50年だったとしたら、それは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_LANGUAGEから派生 およびNLS_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 。