Oracle Databaseでは、TO_TIMESTAMP_TZ() 関数は、引数をTIMESTAMP WITH TIME ZONEの値に変換します データ型。
構文
構文は次のようになります:
TO_TIMESTAMP_TZ(char [ DEFAULT return_value ON CONVERSION ERROR ]
[, fmt [, 'nlsparam' ] ])
char 引数は、CHARの文字列に評価される任意の式にすることができます 、VARCHAR2 、NCHAR 、またはNVARCHAR2 データ型。
オプションのfmt 引数は、 charの形式を指定します 。 fmtを省略した場合 、次に char TIMESTAMP WITH TIME ZONEのデフォルト形式である必要があります NLS_TIMESTAMP_TZ_FORMATによって決定されるデータ型 初期化パラメータ(Oracleセッションの日付形式を確認する方法を参照)。
オプションの'nlsparam' 引数は、月と日の名前と略語が提供される言語を指定します。次の形式を取ります:
'NLS_DATE_LANGUAGE = language' 例
実例となる基本的な例は次のとおりです。
SELECT
TO_TIMESTAMP_TZ(
'25-Aug-2030 18:10:35.123456789 +09:30',
'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM'
)
FROM DUAL; 結果:
25/AUG/30 06:10:35.123456789 PM +09:30
結果の形式は、セッションのNLS_TIMESTAMP_TZ_FORMATによって決定されます。 パラメータ。 NLS_TIMESTAMP_TZ_FORMATの値を確認できます V$NLS_PARAMETERSにクエリを実行してパラメータを設定します ビュー:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_TZ_FORMAT'; 結果:
DD/MON/RR HH12:MI:SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMATのデフォルト値 パラメータはNLS_TERRITORYから派生します パラメータ。私の場合、NLS_TERRITORY パラメータはAUSTRALIAです 。
NLS_TERRITORYを変更するとどうなりますか パラメータを別の領域に移動してから、TO_TIMESTAMP_TZ()を呼び出します もう一度:
ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
SELECT
TO_TIMESTAMP_TZ(
'25-Aug-2030 18:10:35.123456789 +09:30',
'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM'
)
FROM DUAL; 結果:
25-AUG-30 06.10.35.123456789 PM +09:30
今回は、結果が別の形式で返されます。
または、NLS_TIMESTAMP_TZ_FORMATの値を変更することもできます。 パラメータを直接。これにより、他のパラメーターに影響を与えることなく、そのパラメーターが変更されます。詳細と例については、Oracleセッションで日付形式を変更する方法を参照してください。
デフォルトの形式
この例では、 fmtを省略しています。 引数:
SELECT
TO_TIMESTAMP_TZ(
'25-AUG-30 06.10.35.123456789 PM +09:30'
)
FROM DUAL; 結果:
25-AUG-30 06.10.35.123456789 PM +09:30
これを行うとき、引数はTIMESTAMP WITH TIME ZONEのデフォルト形式である必要があります NLS_TIMESTAMP_TZ_FORMATによって決定されるデータ型 パラメータ。
この形式に準拠していない値を渡すとどうなるかの例を次に示します。
SELECT
TO_TIMESTAMP_TZ(
'25-Aug-2030 18:10:35.123456789 +09:30'
)
FROM DUAL; 結果:
Error report - ORA-01849: hour must be between 1 and 12
この場合、24時間制の値を渡しましたが、NLS_TIMESTAMP_TZ_FORMAT パラメータは、AM/PM指定子で12時間制を指定します。
これを修正するには、入力を変更するか、NLS_TIMESTAMP_TZ_FORMATの値を変更する必要があります。 パラメータ。
変換エラー時にデフォルト値を提供する
引数をTIMESTAMP WITH TIME ZONEに変換中にエラーが発生した場合に返す値を指定するオプションもあります。 タイプ。
例:
SET NULL 'null';
SELECT
TO_TIMESTAMP_TZ(
'Oops!'
DEFAULT null ON CONVERSION ERROR
)
FROM DUAL; 結果:
null
この場合、nullを指定しました 変換エラーが発生した場合は常に返される必要があります。戻り値は式またはバインド変数にすることができ、CHARの文字列に評価される必要があります 、VARCHAR2 、NCHAR 、またはNVARCHAR2 データ型、またはnull 。次に、関数はそれをTIMESTAMP WITH TIME ZONEに変換します。 。この変換中にエラーが発生した場合は、エラーが返されます。
上記の例の最初の行に関して、これは単にnullのたびにクライアントに返されるものを指定するためのものです。 値が発生します。デフォルトでは、SQLclおよびSQL * Plusは、nullの場合は常に空白を返します。 SQL SELECTの結果として発生します 声明。
ただし、SET NULLは使用できます 返される別の文字列を指定します。ここでは、文字列nullを指定しました 返却する必要があります。
'nlsparam' 引数
オプションの'nlsparam' 引数は、月と日の名前と略語が提供される言語を指定します。次の形式を取ります:
'NLS_DATE_LANGUAGE = language' 例
SELECT
TO_TIMESTAMP_TZ(
'25-agosto-2030 18:10:35.123456789 +02:00',
'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL; 結果:
25-AUG-30 06.10.35.123456789 PM +02:00
結果は、現在のセッションのNLS_TIMESTAMP_TZ_FORMATに従って引き続き返されることに注意してください。 パラメータ。 入力だけです 別の言語でした。
agostoを変更するとどうなりますか Augustへ 同じ'nlsparam'を使用している間 値:
SELECT
TO_TIMESTAMP_TZ(
'25-August-2030 18:10:35.123456789 +02:00',
'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL; 結果:
Error report - ORA-01843: not a valid month
これは、'nlsparam'で指定された言語で日付を指定しなかったために発生しました 引数(スペイン語)。
Englishに変更する この問題を解決します:
SELECT
TO_TIMESTAMP_TZ(
'25-August-2030 18:10:35.123456789 +02:00',
'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
'NLS_DATE_LANGUAGE = English'
)
FROM DUAL; 結果:
25-AUG-30 06.10.35.123456789 PM +02:00
役立つ場合は、Oracleでサポートされている言語のリストを返す方法を参照してください。
ヌル引数
nullを渡す 結果はnull :
SET NULL 'null';
SELECT
TO_TIMESTAMP_TZ(null)
FROM DUAL; 結果:
null
無効な引数カウント
引数を渡さずに関数を呼び出すと、エラーが発生します:
SELECT TO_TIMESTAMP_TZ()
FROM DUAL; 結果:
Error report - SQL Error: ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function"
ただし、最初の3つが有効である限り、あまりにも多くの引数を渡しても問題は発生しないようです。
SELECT
TO_TIMESTAMP_TZ(
'25-Aug-2030 18:10:35.123456789 +09:30',
'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM',
'NLS_DATE_LANGUAGE = English',
'Oops!',
'Dang!',
'Homer',
'Symptom'
)
FROM DUAL; 結果:
25-AUG-30 06.10.35.123456789 PM +09:30