8

現在、Oracle DBで次のクエリを実行しようとしています

select tzname || ' (UTC'|| tz_offset(tzname) || ')' from v$timezone_names

それほど複雑ではないようです。タイムゾーンの名前と中括弧内の UTC オフセットのみ。しかし、Windows で PL/SQL Developer を使用してクエリを実行すると、常に最後のブレースが消費されます。

だから私はsqlplusに行き、そこでそれを実行しました.今、私は最後のブレースを取得しますが、最後のブレースの前に余分な空白も追加します.

to_char()ネストして試してみましたtrim()が、何も変わりません。別のDBでも試しましたが、常に同じです。

tz_offset文字列の連結に問題があるかどうかは誰にもわかりませんか?

4

3 に答える 3

7

次のクエリを発行します。

select dump(tz_offset(tzname)) from v$timezone_names;

次のような結果が得られます。

Typ=1 Len=7: 43,48,49,58,48,48,0
Typ=1 Len=7: 43,48,49,58,48,48,0
Typ=1 Len=7: 43,48,49,58,48,48,0
Typ=1 Len=7: 43,48,49,58,48,48,0
Typ=1 Len=7: 43,48,49,58,48,48,0
Typ=1 Len=7: 43,48,49,58,48,48,0
...

これは、tz_offset()null で終わる文字列を返すことを示しています (バグの可能性があります)。したがって、クエリに対してOracleは返されます

"Africa/Algiers (UTC+01:00\0)" // Note \0 -> null character
"Africa/Cairo (UTC+03:00\0)" // Note \0 -> null character
...

そのことを念頭に置いて、PL/SQL Developer は \0 を文字列の終わりとして解釈すると推測します (おそらく別のバグ、SQL 文字列は null で終了しません)。末尾のブレース。SQL*PLus は、NULL の代わりに空白を出力することを選択し、文字列の残りの部分に進み、右中括弧を出力します。

tz_offset(...)回避策として、 に置き換えることができますreplace(tz_offset(...), chr(0))。これにより、返されるものからヌルが削除されtz_offset(...)ます。

于 2011-06-01T13:34:52.353 に答える
1

それは部分文字列で動作しますが、なぜそれが起こっているのかという質問には実際には答えません:-):

tzname を選択 || ' (UTC'|| substr(tz_offset(tzname),1,6) || ')' v$timezone_names から;

于 2011-06-01T13:18:57.723 に答える
0

タイムゾーンオフセットを含める必要があるタイムスタンプを返すJSON ajaxリソースを作成していました...その末尾の制御文字は本当に私を悩ませていました。オフの場合は次のようにトリミングします:

regexp_replace(tz_offset('カナダ/山'),'[[:cntrl:]]','')

于 2016-05-04T00:24:54.977 に答える