2017-08-23 2 views
0

私は、Oracle 12cのDBテーブル持って、それの一つが列UTC_TIMESTAMPだがコラム「タイムゾーン付きタイムスタンプ(6)」と数分で「現在の時間」の違い

UTC_TIMESTAMP TIMESTAMP(6) WITH TIME ZONE

それはにタイムスタンプを保存するタイプのものでありUTCの間はcurrent_timestampsystimestampの両方が異なるタイムゾーンでタイムスタンプを与えます。

MAX(utc_timestamp)current_timestampの時間差は、時間帯が異なるために時間差を無視して分単位で取得するにはどうすればよいですか。例えば

:上記の条件の

select current_timestamp from dual; 
Gives=> 23-AUG-17 04.43.16.253931000 PM AMERICA/CHICAGO 

select systimestamp from dual; 
Gives=> 23-AUG-17 05.43.16.253925000 PM -04:00 

select max(UTC_TIMESTAMP) from table_name; 
Gives=> 23-AUG-17 09.40.02.000000000 PM +00:00 

私はMAX(utc_timestamp)current_timestampでの時間差を確認するためにSQLを実行したときに、私は数3

を取得する必要があります私はのようなものが必要だと思います

select (extract(minute from current_timestamp) - extract(minute from max(UTC_TIMESTAMP)) * 1440) AS minutesBetween from table_name; 

しかし、異なるタイムゾーンはそれを台無しにしています。私は-4317のような負の数になります。これは、current_timestampがCSTにあるmax(utc_timestamp)よりも高いため、正しいかもしれません。だから私は試しました:

このSQLはエラーなしで実行されますが、-83461のような大きな負数を生成します。私が間違っていることを見つけるのを助けてください。

答えて

1

ここには本当に2つの問題があります。

1つはCURRENT_TIMESTAMPをUTCに変換することです。それは簡単である:

select CURRENT_TIMESTAMP AT TIME ZONE 'UTC' from dual [.....] 

他の2つのタイムスタンプの差が間隔ではない数であることである(AT TIME ZONE句https://docs.oracle.com/cd/B19306_01/server.102/b14225/ch4datetime.htm#i1007699を使用します)。

select current_timestamp at time zone 'UTC' 
     - to_timestamp_tz('24-AUG-17 04.00.00.000 AM UTC', 'dd-MON-yy hh.mi.ss.ff AM TZR') 
from dual; 

は+(プラス差)00日、00時間、02分、39.366秒を意味

+00 00:02:39.366000 

のようなものを生成します。

分だけ(常に切り捨て)したい場合は、この全体の式をextract(minute from <......>)にラップすることができます。違いが5時間2分であっても、答えは2(分)になりますが、注意してください。おそらく結果が常に1時間未満であることを100%確かめない限り、結果を区間データ型のままにすることが最善の方法です。

+0

入力いただきありがとうございます。私は結果が1時間を超えることができることを知っている。だから、何とか数分で時間を変換し、分の部分に追加できるなら、これは私のために働くだろう。結果はアラート状態で使用されます。結果が事前定義された分数を超えると、アラートがトリガーされます。だから、私は2つのタイムスタンプの実際の差であるべき単一の数字として結果を必要とする。 – 300

+0

@ 300 - 次に** no **、あなたはしません。代わりに、レコードを45分以上経過させる場合は、 '> interval 'のように間隔を45分と比較してください。そうすれば、数字、タイムスタンプ、および間隔だけを心配する必要はありません。 – mathguy

+0

私はあなたの提案にしたがってそれを吹き飛ばして時間/分を分単位で変換し、分単位でそれらを分単位で最終的に得ることを考えると思います。 'select (抽出日(CURRENT_TIMESTAMP AT TIME ZONE 'UTC' - max(UTC_TIMESTAMP)))* 1440) +(CURRENT_TIMESTAMP AT TIME ZONE 'UTC' - max(UTC_TIMESTAMP))) 60分) +(分(CURRENT_TIMESTAMP AT TIME ZONE 'UTC' - 最大(UTC_TIMESTAMP)))) AS minutesBetween commsdesk.fact_realm_utilization; ' – 300

関連する問題