PostgreSQL ユーザーズガイド
PrevChapter 4. データ型Next

日付/時刻型

日付と時刻の計測方法には、基本的にはクロック時刻と時間間隔の 2 種類 があります。時間自体がそうであるように、両者とも継続的でなめらかな量 を持ちます。Postgresでは、関連する SQL92 の日付と時刻型である date および time に加え、2 種類のユーザ志向の 日付/時刻型であるdatetime と timespan を提供しています。

ほとんど歴史的な理由で,その他の日付/時刻型もあります。

Table 4-7. Postgres日付/時刻型

日付/時刻型記憶領域推奨説明
abstime4 バイトオリジナルの日付と時刻限られた範囲
date4 バイトSQL92 タイプ広範囲
datetime8 バイト最良の汎用日付と時刻広範囲、高精度
interval12 バイトSQL92 タイプtimespanと同等
reltime4 バイトオリジナルの時間間隔限られた範囲、低精度
time4 バイトSQL92 タイプ広範囲
timespan12 バイト最良の汎用時間間隔広範囲、高精度
timestamp4 バイトSQL92 タイプ限られた範囲

Table 4-8. Postgres日付/時刻の範囲

日付/時刻型最古最新精度
abstime1901-12-142038-01-191 秒
date4713 BC無制限1 日
datetime4713 BC無制限1 マイクロ秒 〜 14 桁
interval無制限無制限1 マイクロ秒
reltime-68 years+68 years1 秒
time00:00:00.0023:59:59.991 マイクロ秒
timespan無制限無制限1 マイクロ秒 (14 桁)
timestamp1901-12-142038-01-191 秒

Postgresでは、汎用的に使用できるようにと、 SQL92 定義への準拠に対して努力しています。 SQL92 標準には、一時凌ぎで混乱中の日付/時刻型 とその仕様があります。たとえば、日付型には関連するタイムゾーン がないにもかかわらず、時刻型にはあります。デフォルトのタイムゾーン は GMT/UTC からの定数オフセットとして与えられます。しかしながら 実世界でのタイムゾーンにおいては、年間を通じてオフセットが変更 されるため、関連する日付と関連付けなければ意味がありません。

これらの問題に対処するため、Postgresでは 日付と時刻の両方を含む日付/時刻型に対してのみタイムゾーンを関連付ける ようにしており、日付または時刻の一方しか含まない型についてはローカル タイムを仮定しています。将来的には、タイムゾーンのサポートは オペレーティングシステムのタイムゾーン機能から導き出すようにし、 そうすれば夏時間による時刻の早まりやその他の振る舞いについても うまく対応できるようになるでしょう。

将来のリリースにおいては、日付/時刻型の数を減らし、現在のdatetimeの実装はtimestampになり,timespan は interval に、そして(おそらく) abstime および reltime はtimestamp と interval に取って代わることでしょう。 SQL92 標準からの日付/時刻型の定義に関する より多くの arcane 機能は、追求すべきではないでしょう。

日付/時刻のスタイル

出力フォーマットは、 ISO-8601、SQL (Ingres)、従来の Postgres、 および German のうちのどれかにセットできます。

Table 4-9. Postgres日付スタイル

スタイル仕様説明
ISOISO-8601 標準1997-12-17 07:37:16-08
SQL従来のスタイル12/17/1997 07:37:16.00 PST
PostgresオリジナルのスタイルWed Dec 17 07:37:16 1997 PST
German地域固有スタイル17.12.1997 07:37:16.00 PST

SQLスタイルは、月の後に日が来るかなどの違いで、 ヨーロッパ型および非ヨーロッパ(US)型に分けられます。

Table 4-10. Postgresにおける日付の順序規則

スタイル仕様説明
European地域の慣習17/12/1997 15:37:16.00 MET
NonEuropean地域の慣習12/17/1997 07:37:16.00 PST
US地域の慣習12/17/1997 07:37:16.00 PST

日付/時刻型の表示形式に影響を与えるには、いくつかの方法があります。

Postgres V6.3(およびそれ以前のバージョン) では、デフォルトの日付/時刻型のスタイルは "非ヨーロッパ型の伝統的 Postgres(non-European traditional Postgres)" となっています。 将来のリリースにおけるデフォルトは、日付仕様の曖昧さや Y2K 照合問題を を緩和する ISO-8601 になるでしょう。

タイムゾーン

Postgresでは、オペレーティングシステム 配下によるタイムゾーンのサポートを得ます。すべての日付や時刻は、 内部的にはグリニッジ標準時(GMT)として知られるものに代わり、全世界 座標時間(Universal Coordinated Time -- (UTC))で格納されます。 時刻については、デフォルトではサーバのタイムゾーンおけるもので あるため、クライアントのフロントエンドに送られる前に,データベース サーバ上でローカルタイムに変換されます。

タイムゾーンに影響を与えるには、いくつかの方法があります。

無効なタイムゾーンが指定されると、(そうでなくてもほとんどの システムでは)タイムゾーンはGMTになります。

日付/時刻の入力

汎用的な日付や時刻の入力は、ISO 互換、SQL 互換、伝統的な Postgres,およびその他の日付や時刻を 表す、実にいろいろなスタイルで行われます。曖昧な変換を行う (伝統的なスタイルにおける日付の仕様においてはよくありがち)と、 Postgres は曖昧さを解決するために スタイル設定を使用します。

ほとんどの日付/時刻型では、データ入力のコードを共有しています。 これらの型における入力では、実にさまざまなスタイルが存在します。 数値型の日付表現においてもヨーロッパ型と US 慣習は異なる場合が あるので、データが入ってくる前に set datestyle コマンドを使うと適切な変換が行われます。スタイル設定を行っても、 入力における多様なスタイルを使用できることに注意してください。 スタイル設定は,主に出力スタイルを決定し、曖昧さを解決するために 使われます。

特別な値 `current'、 `infinity' および `-infinity' が提供 されています。 `infinity' は他のすべての有効な時刻より以降を表し、 `-infinity' は他のすべての有効な時刻より以前を表します。 `current' は、計算時にこの値が現れると即座に、 その計算時点の現在時刻に置き換えられます。 `now', `today', yesterday', `tomorrow', および `epoch' という 文字列も,時刻の値を表すのに使えます。 `now' は現在のトランザクション処理時刻であり、即座にその時の 時刻に置き換えられる `current' とは異なります。 `epoch' は Jan 1 00:00:00 1970 GMT を表します。

Table 4-11. Postgres日付/時刻型の特殊な定数

定数説明
current現在のトランザクション時刻。その後は変更されない。
epoch1970-01-01 00:00:00+00 Unix システムの時刻0)
infinity他のすべての有効な時刻以降
-infinity他のすべての有効な時刻以前
invalid無効なエントリ
now現在のトランザクション
today今日の午前 0 時
tomorrow明日の午前 0 時
yesterday昨日の午前 0 時

datetime

汎用的な日付や時刻の入力は、ISO 互換、SQL 互換、伝統的な Postgres("絶対時刻"を参照)、 およびその他の日付や時刻を表す、実にいろいろなスタイルで 行われます。出力スタイルは、ISO 互換、SQL 互換、および デフォルト設定である,Postgres 6.0 と互換性のある伝統的 Postgres のいずれかです。

datetimeは以下の書式使って指定されます。

年-月-日 [ 時 : 分 : 秒 ]      [AD,BC] [ タイムゾーン ] 
  年月日 [ 時 : 分 : 秒 ]      [AD,BC] [ タイムゾーン ] 
  月  日 [ 時 : 分 : 秒 ]  年  [AD,BC] [ タイムゾーン ] 
ここで、 
    年は 4013 BC, ..., 巨大な数まで 
    月は Jan, Feb, ..., Dec or 1, 2, ..., 12 
    日は 1, 2, ..., 31 
    時は 00, 02, ..., 23 
    分は 00, 01, ..., 59 
    秒は 00, 01, ..., 59 (60 はうるう秒) 
    タイムゾーンは3文字,または GMT に対する ISO オフセット

有効な日付は Nov 13 00:00:00 4013 BC GMT から未来永劫です。 タイムゾーンは 3 文字(すなわち "GMT" または "PST")または GMT に対する ISO 互換オフセット(すなわち、太平洋標準時では "-08" または "-08:00")です。 日付は内部的にはグリニッジ標準時で格納されます。入出力ルーチンは、 時刻をサーバのローカルタイムに変換します。

timespan

汎用の期間は、ISO 互換、SQL 互換、伝統的な PostgresPostgres("相対時間"を参照)、およびその他の期間を 表す実にいろいろなスタイルで入力されます。 出力フォーマットは、ISO 互換、SQL 互換、およびデフォルト設定である, Postgres互換の伝統的な Postgres のいずれかです。 月や年は "定性的な" 時間間隔であり、他の "定性的な" 時間間隔である 日や時とは別々に格納されます。 日付の計算においては、定性的な時間単位は,関連する日付/時刻の内容を 考慮して行われます。

期間は以下の書式により指定されます。

  時間量 単位 [時間量 単位...] [Direction]
@ 時間量 単位 [Direction]
ここで、
    時間量は ..., `-1', `0', `1', `2', ...
    単位は `second', `minute', `hour', `day', `week', `month', `year',
    'decade', 'century', millenium', 
    またはこれら単位の短縮形や複数形.
    方向は `ago'.

abstime

絶対時刻(abstime)は、制限された範囲(前後68年間)と制限された精度 ( 1 秒)をもつ日付データ型です。 datetime の方が、より大きな範囲と精度をカバーするので 良く使われます。

絶対時刻は以下の書式により指定されます。

  月  日 [ 時 : 分 : 秒 ]  年 [ タイムゾーン ] 
ここで、 
    月は Jan, Feb, ..., Dec or 1, 2, ..., 12 
    日は 1, 2, ..., 31 
    時は 00, 02, ..., 23 
    分は 00, 01, ..., 59 
    秒は 00, 01, ..., 59 (60 はうるう秒) 
    年は 1901, 1902, ..., 2038 

有効な日付は Dec 13 20:45:53 1901 GMT から Jan 19 03:14:04 2038 GMT までです。Version 3.0 では、もはや時刻はグリニッジ標準時では読み書き されません。入出力ルーチンのデフォルトはローカルのタイムゾーンを参照 するようになっています。datetime に関するすべての特殊な 値は、そのまま "絶対時刻" に対しても使用できます。

reltime

相対時刻 reltime は、制限された範囲(前後 68 年間) と制限された精度( 1 秒)をもつ期間指定データ型です。 timespan の方がより大きな範囲と精度を持つので、 これを使った方がよいでしょう。またより重要なことは、 timespan は相対的な単位(月や年)と量的な単位 (日、時など)を識別できます。 一方 reltime は、強制的にひと月をちょうど30日と換算します。 そのため、時間の計算が意図した通り動かないことがあります。 たとえば、1 相対時刻の年を絶対時刻の日に加えても、1 年先の 今日にはならず、今日から 360 日後になります。

reltime は、他の期間型と入出力ルーチンを共有しています。 このセクションの timespan で詳細が述べられています。

timestamp

これは現在では、abstime データ型に非常に良く似た、制限された範囲 を持つ絶対時刻です。これは、汎用入力パーザを他の日付/時刻型と 共有しています。将来のリリースでは、この型は datetime 型の機能を吸収し、今後の SQL92 準拠に移されます。

timestamp は、datetime と同じ書式を 使って指定されます。

interval

interval は SQL92 データ型で、 現在は timespan Postgres データ型にマッピングされています。

tinterval

時刻範囲を以下のように指定します。

[ 'abstime' 'abstime' ]

ここで,
    abstime は絶対時刻フォーマットの時刻です。
特殊な abstime 値である `current'、`infinity' および `-infinity' などが使用できます。


PrevHomeNext
文字型Upブール型