sql >> データベース >  >> RDS >> Oracle

OracleSQLでの日付の比較

    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



    1. EF4-選択したストアドプロシージャは列を返しません

    2. T-SQLで日付をフォーマットする方法

    3. SSHトンネルを介した要塞サーバーのPostgreSQLサーバーへの接続

    4. java.sql.SQLException:jdbc:microsoft:sqlserverに適したドライバーが見つかりません