2016-12-19 3 views
0

Oracleのタイムスタンプでタイムゾーンを使用していましたが、今回は値を文字列として取得し、データベースにロードしようとしています。Oracleのto_timestamp_tzが間違った時刻および/またはタイムゾーンを返すのはなぜですか?

文字列を変換すると、データベースのタイムゾーンに値が入ります。これは奇妙ですが、それに応じて時間を調整しても実行可能です。以下を参照してください:

SELECT TO_CHAR(systimestamp AT TIME ZONE 'Canada/Pacific', 
               'HH24:MI:SS Mon DD, YYYY TZD') now_pst 
    , TO_CHAR(systimestamp AT TIME ZONE 'Canada/Eastern', 
               'HH24:MI:SS Mon DD, YYYY TZD') now_est 
FROM DUAL 

でもたらされる:TO_TIMESTAMP_TZ使用するようになりました

now_pst      now_est 
09:55:50 Dec 19, 2016 PST  12:55:50 Dec 19, 2016 EST 

SELECT '09:55:50 Dec 19, 2016 PST' now_pst 
, TO_TIMESTAMP_TZ('09:55:50 Dec 19, 2016 PST', 'HH24:MI:SS Mon DD, YYYY TZD') now_pst_tz 
, '12:55:50 Dec 19, 2016 EST' now_est 
, TO_TIMESTAMP_TZ('12:55:50 Dec 19, 2016 EST', 'HH24:MI:SS Mon DD, YYYY TZD') now_est_tz 
FROM dual 

結果:私が取得すべきか

now_pst     now_pst_tz      now_est     now_est_tz 
09:55:50 Dec 19, 2016 PST 19.12.2016 09:55:50.000 -05:00 12:55:50 Dec 19, 2016 EST 19.12.2016 12:55:50.000 -05:00 

は次のとおりです。 NOW_PST_TZ = 2016年12月19日09:55:50.000 -08:00 (ない-05:00)

NOW_EST_TZ = 2016年12月19日12:55:50.000 -05:00

私は期待をたくさん持っていますここでは起こっていませんが、主にカナダ/東部とカナダ/パシフィックで同じ時期になるはずです。しかし、私は2つの異なる時間を得ています。

to_timestamp_tzは、文字列を正しいTZDに変換できません。要求されたとして

select sessiontimezone, dbtimezone from dual 

結果:

SESSIONTIMEZONE DBTIMEZONE 
-05:00   +00:00 
+0

あなたはこのクエリを実行できますか? – krokodilko

+0

@krokodilko、値 'dbtimezone'から何を期待していますか? –

+0

@Wernfried Domscheit 'systimestamp'関数は、データベースが存在するシステムのシステム日付を* system time zone *で返します。 'dbtimezone'関数は、このタイムゾーン(システムタイムゾーン)を返します。 'sessiontimezone'はセッションのタイムゾーンを返します。それらは相異なるものにすることができます(dbtimezoneとsessiontimezone)。 – krokodilko

答えて

0

変更YYYY TZDYYYY TZR TZDへの書式モデルの最後の部分 - あなたは書式モデルでTZR表示されません。

SQL> SELECT '09:55:50 Dec 19, 2016 PST' now_pst 
    2 , TO_TIMESTAMP_TZ('09:55:50 Dec 19, 2016 PST', 'HH24:MI:SS Mon DD, YYYY TZR TZD') now_pst_tz 
    3 , '12:55:50 Dec 19, 2016 EST' now_est 
    4 , TO_TIMESTAMP_TZ('12:55:50 Dec 19, 2016 EST', 'HH24:MI:SS Mon DD, YYYY TZR TZD') now_est_tz 
    5 FROM dual; 

NOW_PST     NOW_PST_TZ 
------------------------- --------------------------------------------------------------------------- 
NOW_EST     NOW_EST_TZ 
------------------------- --------------------------------------------------------------------------- 
09:55:50 Dec 19, 2016 PST 19.12.2016 09:55:50.000 -08:00 
12:55:50 Dec 19, 2016 EST 19.12.2016 12:55:50.000 -05:00 


1 row selected. 

編集:Wernfriedは彼の答えに示したようまた、入力文字列にCanada/PacificはなくとCanada/EasternではなくESTを使用することをお勧めします。

+0

興味深い... TZRは、ORA -01882タイムゾーン領域%sが見つかりませんでしたが、PLSQLで機能します。それで十分かもしれない。 –

+0

btwのデータはpaypalから来て、私はそれを支配していません。社会では、この形式の日時がよく理解されています。しかし、私はちょうど北アメリカを考えているサンドボックスに身を包んでいるかもしれません。おそらく、私は笑 エッジの上にピアする必要があります私が見つけた小さなドキュメントはTZR TZDとは対照的に、TZD形式をサポートするように見えるん。しかし、フォーマットマスクはそれほど多くありません。 私が次の日にこれを証明できるかどうかがわかります。早速のご返事ありがとうございます :) –

0

TZDは夏時間情報を意味します。 TZD値は、サマータイム情報を含む短縮されたタイムゾーン文字列です。それはTZRで指定された地域に対応していなければなりません。タイムゾーンの領域なしTZDを使用して

は曖昧で、このクエリに確認してください:あなたは​​を使用する場合

SELECT tzabbrev, tzname, TZ_OFFSET(tzname) 
FROM V$TIMEZONE_NAMES 
WHERE tzabbrev in ('PST', 'EST'); 

TZABBREV TZNAME TZ_OFFSET(TZNAME) 
EST America/Antigua -04:00 
EST America/Atikokan -05:00 
EST America/Cambridge_Bay -07:00 
EST America/Cancun -06:00 
EST America/Cayman -05:00 
EST America/Chicago -06:00 
EST America/Coral_Harbour -05:00 
EST America/Detroit -05:00 
EST America/Fort_Wayne -05:00 
EST America/Grand_Turk -05:00 
EST America/Indiana/Indianapolis -05:00 
EST America/Indiana/Knox -06:00 
EST America/Indiana/Marengo -05:00 
EST America/Indiana/Petersburg -05:00 
EST America/Indiana/Tell_City -06:00 
EST America/Indiana/Vevay -05:00 
EST America/Indiana/Vincennes -05:00 
EST America/Indiana/Winamac -05:00 
EST America/Indianapolis -05:00 
EST America/Iqaluit -05:00 
EST America/Jamaica -05:00 
EST America/Kentucky/Louisville -05:00 
EST America/Kentucky/Monticello -05:00 
EST America/Knox_IN -06:00 
EST America/Louisville -05:00 
EST America/Managua -06:00 
EST America/Menominee -06:00 
EST America/Merida -06:00 
EST America/Moncton -04:00 
EST America/Montreal -05:00 
EST America/Nassau -05:00 
EST America/New_York -05:00 
EST America/Nipigon -05:00 
EST America/Panama -05:00 
EST America/Pangnirtung -05:00 
EST America/Port-au-Prince -05:00 
EST America/Rankin_Inlet -06:00 
EST America/Resolute -06:00 
EST America/Santo_Domingo -04:00 
EST America/Thunder_Bay -05:00 
EST America/Toronto -05:00 
EST Antarctica/Macquarie +11:00 
EST Australia/ACT +11:00 
EST Australia/Brisbane +10:00 
EST Australia/Broken_Hill +10:30 
EST Australia/Canberra +11:00 
EST Australia/Currie +11:00 
EST Australia/Hobart +11:00 
EST Australia/LHI +11:00 
EST Australia/Lindeman +10:00 
EST Australia/Lord_Howe +11:00 
EST Australia/Melbourne +11:00 
EST Australia/NSW +11:00 
EST Australia/Queensland +10:00 
EST Australia/Sydney +11:00 
EST Australia/Tasmania +11:00 
EST Australia/Victoria +11:00 
EST Australia/Yancowinna +10:30 
EST CST -06:00 
EST Canada/Eastern -05:00 
EST EST -05:00 
EST EST5EDT -05:00 
EST Jamaica -05:00 
EST US/Central -06:00 
EST US/East-Indiana -05:00 
EST US/Eastern -05:00 
EST US/Indiana-Starke -06:00 
EST US/Michigan -05:00 
PST America/Bahia_Banderas -06:00 
PST America/Boise -07:00 
PST America/Creston -07:00 
PST America/Dawson -08:00 
PST America/Dawson_Creek -07:00 
PST America/Ensenada -08:00 
PST America/Hermosillo -07:00 
PST America/Inuvik -07:00 
PST America/Juneau -09:00 
PST America/Los_Angeles -08:00 
PST America/Mazatlan -07:00 
PST America/Metlakatla -08:00 
PST America/Santa_Isabel -08:00 
PST America/Sitka -09:00 
PST America/Tijuana -08:00 
PST America/Vancouver -08:00 
PST America/Whitehorse -08:00 
PST Canada/Pacific -08:00 
PST Canada/Yukon -08:00 
PST Mexico/BajaNorte -08:00 
PST Mexico/BajaSur -07:00 
PST PST -08:00 
PST PST8PDT -08:00 
PST Pacific/Pitcairn -08:00 
PST US/Pacific -08:00 
PST US/Pacific-New -08:00 

は、あなたは完全な地域名でTZRを使用する必要があります。

TO_TIMESTAMP_TZ('09:55:50 Dec 19, 2016 PST', 'HH24:MI:SS Mon DD, YYYY TZD')は、TO_TIMESTAMP_TZ('09:55:50 Dec 19, 2016 '||SESSIONTIMEZONE||' PST', 'HH24:MI:SS Mon DD, YYYY TZR TZD')に相当します。現在のセッションのタイムゾーンの省略形が/ESTにない場合は失敗します。デュアルからDBTIMEZONE、SESSIONTIMEZONEを選択し、 `;`と、それは問題になります追加:

関連する問題