2017-06-19 19 views
1

同じ時間に作成された行の数に応じてレポートを作成しようとしていますが、抽出機能を使用して行をグループ化しようとしましたが、結果の情報は、例えば:抽出された時間(...からの時間)

select 
to_char(resolved_time,'YY/MM/DD') Day, 
to_char(resolved_time, 'HH24') hour_tmp, 
extract(hour from resolved_time) Hour 
from RESOLUTION_HISTORY h 
where resolved_time >= timestamp '2017-01-01 00:00:00' 
and resolved_time < timestamp '2017-01-02 00:00:00' 
and modified_by in 'user1' 
order by 2; 

と私の結果はこのようなものになります。あなたが見ることができるように

Day   Hour_Tmp Hour 
17/01/01 14   20 
17/01/01 14   20 
17/01/01 14   20 
17/01/01 14   20 
17/01/01 14   20 
17/01/01 14   20 
17/01/01 14   20 
17/01/01 14   20 
17/01/01 15   21 
17/01/01 17   23 
17/01/01 17   23 
17/01/01 18   0 

を、時間分解の実際の値と抽出液との違いをtheresの、私のセッションを変更しようとしましたが、それは役に立たないようです。 ローカルセッションでこの設定を変更するオプションはありますか?

+3

クエリの実行時に列のデータ型が「タイムゾーン付きタイムスタンプ」(プレーンタイムスタンプではない)、照会する値のタイムゾーン、およびセッションのタイムゾーンであることを確認できますか?そしてあなたのデータベースのタイムゾーン? –

+0

はいタイムゾーンのタイムスタンプです – Zombraz

答えて

2

表示される違いは、UTCと列の値に関連付けられたタイムゾーンの間のオフセットです。 00ある

select extract(hour from timestamp '2017-01-01 00:00:00 America/New_York') from dual; 

EXTRACT(HOURFROMTIMESTAMP'2017-01-0100:00:00AMERICA/NEW_YORK') 
-------------------------------------------------------------- 
                  5 

DBTIMEZONE:00推奨されているように、データベースサーバがBST上で、私のセッションも(ヨーロッパ/ロンドン経由)BSTであるあなたが単純化されたバージョンを見ることができます。しかし、それは関連性がありません。

Buried in the documentation

タイムゾーン値を持つ日時から抽出する場合、戻り値はUTCです。

(あなたの列には、あなたはおそらくも、あまり有用であるセッションのタイムゾーンで時間を参照してくださいねtimestamp with local time zoneた場合。)

あなたはプレーンなタイムスタンプにあなたの列をキャストすることによって、それを回避することができ、これは、本質的にタイムゾーン情報切り捨て:

extract(hour from cast(resolved_time as timestamp)) 

をし、あなたのデータをあなたとの違いを見ることができます:

select 
to_char(resolved_time,'YYYY-MM-DD HH24:MI:SS TZR') full_value, 
to_char(resolved_time,'YY/MM/DD') Day, 
to_char(resolved_time, 'HH24') hour_tmp, 
extract(hour from resolved_time) Hour_utc, 
extract(hour from cast(resolved_time as timestamp)) Hour 
from RESOLUTION_HISTORY h 
where resolved_time >= timestamp '2017-01-01 00:00:00 America/New_York' 
and resolved_time < timestamp '2017-01-02 00:00:00 America/New_York' 
and modified_by in 'user1' 
order by 2; 

FULL_VALUE           DAY  HO HOUR_UTC  HOUR 
---------------------------------------------------- -------- -- ---------- ---------- 
2017-01-01 12:00:00 AMERICA/NEW_YORK     17/01/01 12   17   12 

ちなみに、(仮定した)列のタイムゾーン値をフィルタ条件に含めたので、セッションのタイムゾーンに依存する必要はありません。複数のタイムゾーンの値がある場合は、フィルタにもその値を許可する必要があります。抽出およびグループ化する前に、列の値を特定のゾーンに変換する必要があります。あなたがしようとしていることに依存します。


Tony’s Tirade against TIMESTAMP WITH TIME ZONEも参照してください。

+0

ありがとうございます! (キャストからの時間(タイムスタンプとして解決された時間)) トリックをしました! – Zombraz

関連する問題