2016-04-08 4 views
2

次のクエリを処理します。SYSDATEの代わりにSQL UTCの日付

SELECT MIN(departure_date), ch_invoice.invoice_id 
FROM ch_invoice 
INNER JOIN ch_trip 
ON ch_invoice.invoice_id = ch_trip.invoice_id 
WHERE departure_date < SYSDATE 
AND service_rendered = 0 
AND paid = 1 
Group By ch_invoice.invoice_id 

それが当たっていることをデータベースに日付がまだ変更されていない、と私たちは私たちの日付の標準としてUTCを使用している場所でもありますので、それはUTCDATEようなものでSYSDATEを交換することが可能です?私は、UTCが現在どの日にいるのかを知る必要があります。

答えて

3

AntDCが示唆したように、the SYS_EXTRACT_UTC() functionを使用できます。これは、 'タイムゾーン付き日時'をどのタイムゾーンからでもUTCに変換します。

SYSDATEにはタイムゾーンがありません。これを渡した場合、暗黙的にシステムのタイムゾーンに変換されるため、動作しますが、代わりにSYSTIMESTAMPを使用することができます。これは、すでにゾーンを認識しているためです。

コメントには、日付が必要ですが、すべてのOracle日付には時間コンポーネントがあります。あなたはTRUNC()と(あなたがやっているの比較のために理にかなっている)深夜に設定した時間と日付としてタイプを結果を得ることができます。

select systimestamp, 
    sys_extract_utc(systimestamp) as utctime, 
    trunc(sys_extract_utc(systimestamp)) as utcdate 
from dual; 

SYSTIMESTAMP      UTCTIME     UTCDATE 
-------------------------------- ------------------------- ------------------- 
2016-04-08 17:18:27.352 +01:00 2016-04-08 16:18:27.352 2016-04-08 00:00:00 

は、英国内のサーバー上で実行しているので、現地時間はBSTです。その日の変更を伴わないので、効果はなく、サーバーの時間のセッション時間を用いて実証することができます

alter session set time_zone = '+12:00'; 

select current_timestamp, 
    sys_extract_utc(current_timestamp) as utctime, 
    trunc(sys_extract_utc(current_timestamp)) as utcdate 
from dual; 

CURRENT_TIMESTAMP    UTCTIME     UTCDATE 
-------------------------------- ------------------------- ------------------- 
2016-04-09 04:23:17.910 +12:00 2016-04-08 16:23:17.910 2016-04-08 00:00:00 

私のセッション時間は2016年4月9日であるが、それはまだ見つかっUTC日付は2016-04-08となります。

(明確な、私ははあなたがcurrent_timestampcurrent_dateの使用に切り替えるを示唆しておりませんことを特徴とする。私は純粋にデモとして代わりにsystimestampsysdateのそれらを使用しています)。

+0

あなたの編集は私の質問を予期し、それに答えました。ありがとうございました!それは非常に明確です。私はこれが私が探しているものを達成すると信じています。 – CheeseFry

1
SELECT SYS_EXTRACT_UTC(departure_date)UTC_SYS, SYSTIMESTAMP FROM DUAL; 
+0

スニペットありがとうございました。それが何をしているのか説明できますか? – CheeseFry

+0

http://psoug.org/definition/SYS_EXTRACT_UTC.htm SYS_EXTRACT_UTCは、指定された日付のUTC日付を返す関数です。 – AntDC

+0

テーブル時間ではなくシステム時間を変換しないでください。つまり、SYS_EXTRACT_UTC(SYSTIMESTAMP) ? 'departure_date'でそれを呼び出すとDATE型である場合、暗黙的にシステムタイムゾーンに変換されます。これは、保存された値が既にUTCであると思われるので、奇妙な結果をもたらす可能性があります。 –

関連する問題