標準時、世界時、世界標準時、協定世界時を求める
呼称は色々あるみたいですが、俗に GMT 、グリニッジ標準時 と呼ばれているもの。正確には UTC が正しい。
SYS_EXTRACT_UTC ( datetime_with_timezone )
return [ TIMESTAMP ]
datetime_with_timezone | タイムゾーン付きの日付式 |
- 指定したタイムゾーン付きの日付を協定世界時のタイムスタンプ型(タイムゾーンなし) にして戻す。
SYS_EXTRACT_UTC 関数の内容
タイムゾーン付きの日付式 datetime_with_timezone をタイムスタンプ型の標準時(協定世界時)に変換する。
SYS_EXTRACT_UTC 使用例
SQL> select SYS_EXTRACT_UTC(timestamp '2007-01-01 09:00:00.0 +09:00')
2 from dual;
SYS_EXTRACT_UTC(TIMESTAMP'2007-01-0109:00:00.0+09:00')
----------------------------------------------------------------------
2007-01-01 00:00:00
UNIX タイム、エポック秒を求める豆知識
UNIX で良く知られた時間の保持形式として 1970年1月1日 00:00:00 を起算とした経過秒を保持する エポック秒 というものがある。この 1970年1月1日 00:00:00 はセッションタイムゾーンの 0 時 ではなく UTC のタイムゾーン環境における時刻から経過した秒のことである。日本のタイムゾーンは +09:00 なので 日本時間では 1970年1月1日 09:00:00 が起算する基準時間となる。
セッション日付 (current_time)を UTC のタイムゾーンに変換してエポック秒を求める式は以下のようになる。(日本でしか使われないなら 1970-01-01 09:00 を起算日にしてしまう方法もあるが正攻法で計算する)
1 select (
2 cast(SYS_EXTRACT_UTC(current_timestamp) as date)
3 - cast(from_tz(timestamp '1970-01-01 00:00:00', '00:00') as date)
4 ) * 24 * 60 * 60 epoc_seconds
5* from dual
EPOC_SECONDS
------------
1602178965
この変換式をタイムゾーンをLOCALTIMEZONE = UTC とみなした(※) 状態で行い、簡略化した式にすると以下となる。
(※) もともと DATE 型には タイムゾーン情報が存在していないので気にする必要がない。
1 select (
2 cast(SYS_EXTRACT_UTC(current_timestamp) as date)
3 - date '1970-01-01'
4 ) * 24 * 60 * 60 epoc_seconds
5* from dual
EPOC_SECONDS
------------
1602179079
UNIX タイム(エポック秒)を戻すストアドファンクション UNIXTIME
CREATE OR REPLACE FUNCTION UNIXTIME( P_TIMESTAMP IN TIMESTAMP )
RETURN PLS_INTEGER
IS
vDate DATE;
vEpoc NUMBER;
BEGIN
vDate := SYS_EXTRACT_UTC(P_TIMESTAMP);
vEpoc := vDate - DATE '1970-01-01';
RETURN vEpoc * 24 * 60 * 60;
END;
/
※ 起算時刻を誤って 1900-01-01 としていたものを 1970-01-01 に修正しました(2020-10-09)
タイムゾーン・時間帯間の日付のコンバート
⇒ 別のタイムゾーン日付をセッションタイムゾーン日付に変換
UTC と GMT の違い
広く知られたグリニッジ天文台の GMT は、実はかなり前(1928年)より世界の標準時ではなくなっている。
現在の世界標準時は 協定世界時 UTC (Coordinated Universal Time)で セシウム原子時計 による時間をもとに GMT との間で不定期に補正された時刻である。(⇒うるう秒)
GMT は天体観測によって得られる時間である。
SQL 関数 - SYS_EXTRACT_UTC 関連