Oracle の関数 TZ_OFFSET の戻りデータ型は何ですか??
例えば、
select tz_offset(DBTIMEZONE) from dual;
-04:00
Oracle の関数 TZ_OFFSET の戻りデータ型は何ですか??
例えば、
select tz_offset(DBTIMEZONE) from dual;
-04:00
それは次のように見えますVARCHAR2
:
SQL> SELECT TZ_OFFSET('UTC'), DUMP(TZ_OFFSET('UTC')) FROM DUAL;
TZ_OFFS DUMP(TZ_OFFSET('UTC'))
------- --------------------------------
+00:00 Typ=1 Len=7: 43,48,48,58,48,48,0
はTyp=1
を示しますが、ASCII ダンプの最後にVARCHAR2
があることに注意してください。,0
これは、文字列に\0
-type ターミネータがあることを意味します。これは通常 a には当てはまりませんVARCHAR2
が、それでも一般的な文字列っぽい型として扱います。
これは文字セットによって異なる場合があります。よくわかりません。上記で実行したクエリは、NLS_CHARACTERSET
=WE8MSWIN1252
とNLS_NCHAR_CHARACTERSET
=を使用した Oracle インスタンスに対するものでしたAL16UTF16
。
補遺TZ_OFFSET
-出力を数値に変換する方法を尋ねるフォローアップの質問。方法は次のとおりです。
注:分を含む負のタイムゾーンオフセットでは機能しないことに気付いた後、これを更新しました。たとえば、元の方程式 (現在は削除されています) はではなく に変換-03:30
され-2.5
-3.5
ます。
完全なコマンドは次のとおりです。
SIGN(TO_NUMBER(SUBSTR(TZ_OFFSET('whatever'), 1, 3))) * (
TO_NUMBER(SUBSTR(TZ_OFFSET('whatever'), 2, 2)) +
TO_NUMBER(SUBSTR(TZ_OFFSET('whatever'), 5, 2)) / 60
)
SUBSTR
3 番目は「位置 5 から始まる 2 文字」を指定していることに注意してください( SUBSTR(..., 5, 2)
)。通常、「位置 5 から文字列の末尾まで」( ) と言いますSUBSTR(..., 5)
が、これには奇妙な末尾のヌル文字 ( \0
、 で見られるようにDUMP
) が含まれ、エラーが発生します。
どうですか:
SUBSTR(TZ_OFFSET('whatever'), 1, 3) + SUBSTR(TZ_OFFSET('whatever'), 5, 2) / 60
オフセットを数値に変換するには?
ed-gibbsが言ったように、最後に \0 を持つ VARCHAR2 のように見えます。タイム ゾーン オフセットに基づいてタイム ゾーン名を検索する方法は次のとおりです。
SELECT distinct tzname,SUBSTR(tz_offset(tzname),1,6) FROM V$TIMEZONE_NAMES WHERE SUBSTR(tz_offset(tzname),1,6) = '-04:00' order by tzname;