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

OracleのTO_TIMESTAMP()関数

    Oracle Databaseでは、TO_TIMESTAMP() 関数は、引数をTIMESTAMPの値に変換します データ型。

    構文

    構文は次のようになります:

    TO_TIMESTAMP(char [ DEFAULT return_value ON CONVERSION ERROR ]
      [, fmt [, 'nlsparam' ] ])

    char 引数は、CHARの文字列に評価される任意の式にすることができます 、VARCHAR2NCHAR 、またはNVARCHAR2 データ型。

    オプションのfmt charの形式を指定します fmtを省略した場合 、次に char TIMESTAMPのデフォルト形式である必要があります NLS_TIMESTAMP_FORMATによって決定されるデータ型 初期化パラメータ(Oracleセッションの日付形式を確認する方法を参照)。

    オプションの'nlsparam' 引数は、月と日の名前と略語が提供される言語を指定します。次の形式を取ります:

    'NLS_DATE_LANGUAGE = language'

    実例となる基本的な例は次のとおりです。

    SELECT 
        TO_TIMESTAMP(
            '25-Aug-2030 18:10:35.123456789', 
            'DD-Mon-RRRR HH24:MI:SS.FF'
        )
    FROM DUAL;

    結果:

    25/AUG/30 06:10:35.123456789 PM

    結果の形式は、セッションのNLS_TIMESTAMP_FORMATによって決定されます。 パラメータ。 NLS_TIMESTAMP_FORMATの値を確認できます V$NLS_PARAMETERSにクエリを実行してパラメータを設定します ビュー:

    SELECT VALUE
    FROM V$NLS_PARAMETERS
    WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT';

    結果:

    DD/MON/RR HH12:MI:SSXFF AM

    NLS_TIMESTAMP_FORMATのデフォルト値 パラメータはNLS_TERRITORYから派生します パラメータ。私の場合、NLS_TERRITORY パラメータはAUSTRALIAです 。

    NLS_TERRITORYを変更するとどうなりますか パラメータを別の領域に移動してから、TO_TIMESTAMP()を呼び出します もう一度:

    ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
    SELECT 
        TO_TIMESTAMP(
            '25-Aug-2030 18:10:35.123456789', 
            'DD-Mon-RRRR HH24:MI:SS.FF'
        )
    FROM DUAL;

    結果:

    25-AUG-30 06.10.35.123456789 PM

    今回は、結果が別の形式で返されます。

    または、NLS_TIMESTAMP_FORMATの値を変更することもできます。 パラメータを直接。これにより、他のパラメーターに影響を与えることなく、そのパラメーターが変更されます。詳細と例については、Oracleセッションで日付形式を変更する方法を参照してください。

    デフォルトの形式

    この例では、 fmtを省略しています。 引数:

    SELECT 
        TO_TIMESTAMP(
            '25-AUG-30 06.10.35.123456789 PM'
        )
    FROM DUAL;

    結果:

    25-AUG-30 06.10.35.123456789 PM

    これを行うとき、引数はTIMESTAMPのデフォルト形式である必要があります NLS_TIMESTAMP_FORMATによって決定されるデータ型 初期化パラメータ。

    この形式に準拠していない値を渡すとどうなるかの例を次に示します。

    SELECT 
        TO_TIMESTAMP(
            '25-Aug-2030 18:10:35.123456789'
        )
    FROM DUAL;

    結果:

    ORA-01849: hour must be between 1 and 12
    01849. 00000 -  "hour must be between 1 and 12"
    *Cause:    
    *Action:

    この場合、24時間制の値を渡しましたが、NLS_TIMESTAMP_FORMAT パラメータは、AM/PM指定子で12時間制を指定します。

    これを修正するには、入力を変更するか、NLS_TIMESTAMP_FORMATの値を変更する必要があります。 パラメータ。

    変換エラー時にデフォルト値を提供する

    引数をTIMESTAMPに変換中にエラーが発生した場合に、値を返すオプションもあります。 タイプ。

    例:

    SET NULL 'null';
    SELECT 
        TO_TIMESTAMP(
        'Oops!'
        DEFAULT null ON CONVERSION ERROR
        )
    FROM DUAL;

    結果:

    null

    この場合、nullを指定しました 変換エラーが発生した場合は常に返される必要があります。

    デフォルトでは、SQLclおよびSQL * Plusは、nullの場合は常に空白を返します。 SQL SELECTの結果として発生します 声明。

    ただし、SET NULLは使用できます 返される別の文字列を指定します。ここでは、文字列nullを指定しました 返却する必要があります。

    'nlsparam' 引数

    オプションの'nlsparam' 引数は、月と日の名前と略語が提供される言語を指定します。次の形式を取ります:

    'NLS_DATE_LANGUAGE = language'

    SELECT 
        TO_TIMESTAMP(
            '25-agosto-2030 18:10:35.123456789', 
            'DD-Month-RRRR HH24:MI:SS.FF',
            'NLS_DATE_LANGUAGE = SPANISH'
        )
    FROM DUAL;

    結果:

    25-AUG-30 06.10.35.123456789 PM

    結果は、現在のセッションのNLS_TIMESTAMP_FORMATに従って引き続き返されることに注意してください。 パラメータ。 入力だけです 別の言語でした。

    agostoを変更するとどうなりますか Augustへ 同じ'nlsparam'を使用している間 値:

    SELECT 
        TO_TIMESTAMP(
            '25-August-2030 18:10:35.123456789', 
            'DD-Month-RRRR HH24:MI:SS.FF',
            'NLS_DATE_LANGUAGE = SPANISH'
        )
    FROM DUAL;

    結果:

    ORA-01843: not a valid month
    01843. 00000 -  "not a valid month"
    *Cause:    
    *Action:

    これは、'nlsparam'で指定された言語で日付を指定しなかったために発生しました 引数(スペイン語)。

    Englishに変更する この問題を解決します:

    SELECT 
        TO_TIMESTAMP(
            '25-August-2030 18:10:35.123456789', 
            'DD-Month-RRRR HH24:MI:SS.FF',
            'NLS_DATE_LANGUAGE = English'
        )
    FROM DUAL;

    結果:

    25-AUG-30 06.10.35.123456789 PM

    役立つ場合は、Oracleでサポートされている言語のリストを返す方法を参照してください。

    ヌル引数

    nullを渡す 結果はnull

    SET NULL 'null';
    SELECT 
        TO_TIMESTAMP(null)
    FROM DUAL;

    結果:

    null

    無効な引数カウント

    引数を渡さずに関数を呼び出すと、エラーが発生します:

    SELECT TO_TIMESTAMP()
    FROM DUAL;

    結果:

    ORA-00938: not enough arguments for function
    00938. 00000 -  "not enough arguments for function"
    *Cause:    
    *Action:
    Error at Line: 8 Column: 8

    ただし、最初の3つが有効である限り、あまりにも多くの引数を渡しても問題は発生しないようです。

    SELECT 
        TO_TIMESTAMP(
            '25-Aug-2030 18:10:35.123456789', 
            'DD-Mon-RRRR HH24:MI:SS.FF',
            'NLS_DATE_LANGUAGE = English',
            'Oops!',
            'Dang!',
            'Homer',
            'Symptom'
        )
    FROM DUAL;

    結果:

    25-AUG-30 06.10.35.123456789 PM

    1. MySQLのカンマ区切り文字列を一時テーブルに分割

    2. MySQLの`REPLACE`と`INSERT... ON DUPLICATE KEY UPDATE`の実際的な違いは何ですか?

    3. Struts2をHibernateおよびPostgreSQLと接続する方法

    4. SQL Serverデータベースの現在のrowversion値を返す方法(T-SQLの例)