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) -
YYYY
4桁の年-私の意見では、これは常に 2桁の年より良いYY
何世紀を指しているのか混乱することはありません。 -
HH24
1日の時間、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
。