2

Oracle の関数 TZ_OFFSET の戻りデータ型は何ですか??

例えば、

select tz_offset(DBTIMEZONE) from dual;

-04:00

4

4 に答える 4

8

それは次のように見えます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=WE8MSWIN1252NLS_NCHAR_CHARACTERSET=を使用した Oracle インスタンスに対するものでしたAL16UTF16


補遺TZ_OFFSET-出力を数値に変換する方法を尋ねるフォローアップの質問。方法は次のとおりです。

  1. 時間の部分を数値に変換します
  2. 分の部分を数値に変換し、60 で割ります
  3. 2 つの値を足し合わせる
  4. オフセットの符号 (+ または -) を処理する

分を含む負のタイムゾーンオフセットでは機能しないことに気付いた後、これを更新しました。たとえば、元の方程式 (現在は削除されています) はではなく に変換-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
)

SUBSTR3 番目は「位置 5 から始まる 2 文字」を指定していることに注意してください( SUBSTR(..., 5, 2))。通常、「位置 5 から文字列の末尾まで」( ) と言いますSUBSTR(..., 5)が、これには奇妙な末尾のヌル文字 ( \0、 で見られるようにDUMP) が含まれ、エラーが発生します。

于 2013-04-09T13:46:14.963 に答える
1

どうですか:

SUBSTR(TZ_OFFSET('whatever'), 1, 3) + SUBSTR(TZ_OFFSET('whatever'), 5, 2) / 60

オフセットを数値に変換するには?

于 2015-06-19T20:12:46.587 に答える
1

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;
于 2016-05-27T19:39:39.677 に答える