PostgreSQL | ||
---|---|---|
Prev | Chapter 8. データ型 | Next |
日付と時刻の計測方法には、基本的にはクロック時刻と時間間隔の 2 種類 があります。時間自体がそうであるように、両者とも継続的でなめらかな量 を持ちます。Postgresでは、関連する SQL92 の日付と時刻型である date および time に加え、2 種類のユーザ志向の 日付/時刻型であるdatetime と timespan を提供しています。
ほとんど歴史的な理由で,その他の日付/時刻型もあります。
Table 8-7. Postgres日付/時刻型
日付/時刻型 | 記憶領域 | 推奨 | 説明 |
---|---|---|---|
abstime | 4 バイト | オリジナルの日付と時刻 | 限られた範囲 |
date | 4 バイト | SQL92 タイプ | 広範囲 |
datetime | 8 バイト | 最良の汎用日付と時刻 | 広範囲、高精度 |
interval | 12 バイト | SQL92 タイプ | timespanと同等 |
reltime | 4 バイト | オリジナルの時間間隔 | 限られた範囲、低精度 |
time | 4 バイト | SQL92 タイプ | 広範囲 |
timespan | 12 バイト | 最良の汎用時間間隔 | 広範囲、高精度 |
timestamp | 4 バイト | SQL92 タイプ | 限られた範囲 |
Table 8-8. Postgres日付/時刻の範囲
日付/時刻型 | 最古 | 最新 | 精度 |
---|---|---|---|
abstime | 1901-12-14 | 2038-01-19 | 1 秒 |
date | 4713 BC | 無制限 | 1 日 |
datetime | 4713 BC | 無制限 | 1 マイクロ秒 〜 14 桁 |
interval | 無制限 | 無制限 | 1 マイクロ秒 |
reltime | -68 years | +68 years | 1 秒 |
time | 00:00:00.00 | 23:59:59.99 | 1 マイクロ秒 |
timespan | 無制限 | 無制限 | 1 マイクロ秒 (14 桁) |
timestamp | 1901-12-14 | 2038-01-19 | 1 秒 |
Postgresでは、汎用的に使用できるようにと、 SQL92 定義への準拠に対して努力しています。 SQL92 標準には、一時凌ぎで混乱中の日付/時刻型 とその仕様があります。たとえば、日付型には関連するタイムゾーン がないにもかかわらず、時刻型にはあります。デフォルトのタイムゾーン は GMT/UTC からの定数オフセットとして与えられます。しかしながら 実世界でのタイムゾーンにおいては、年間を通じてオフセットが変更 されるため、関連する日付と関連付けなければ意味がありません。
これらの問題に対処するため、Postgresでは 日付と時刻の両方を含む日付/時刻型に対してのみタイムゾーンを関連付ける ようにしており、日付または時刻の一方しか含まない型についてはローカル タイムを仮定しています。将来的には、タイムゾーンのサポートは オペレーティングシステムのタイムゾーン機能から導き出すようにし、 そうすれば夏時間による時刻の早まりやその他の振る舞いについても うまく対応できるようになるでしょう。
将来のリリースにおいては、日付/時刻型の数を減らし、現在のdatetimeの実装はtimestampになり,timespan は interval に、そして(おそらく) abstime および reltime はtimestamp と interval に取って代わることでしょう。 SQL92 標準からの日付/時刻型の定義に関する より多くの arcane 機能は、追求すべきではないでしょう。
出力フォーマットは、 ISO-8601、SQL (Ingres)、従来の Postgres、 および German のうちのどれかにセットできます。
Table 8-9. Postgres日付スタイル
スタイル仕様 | 説明 | 例 |
---|---|---|
ISO | ISO-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 8-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 |
日付/時刻型の表示形式に影響を与えるには、いくつかの方法があります。
postmaster の開始時に、直接バックエンドで使用される PGDATESTYLE 環境変数
セッションの開始時に、フロントエンド libpq で使用される PGDATESTYLE 環境変数
SET DateStyle SQL コマンド
Postgres V6.3(およびそれ以前のバージョン) では、デフォルトの日付/時刻型のスタイルは "非ヨーロッパ型の伝統的 Postgres(non-European traditional Postgres)" となっています。 将来のリリースにおけるデフォルトは、日付仕様の曖昧さや Y2K 照合問題を を緩和する ISO-8601 になるでしょう。
Postgresでは、オペレーティングシステム 配下によるタイムゾーンのサポートを得ます。すべての日付や時刻は、 内部的にはグリニッジ標準時(GMT)として知られるものに代わり、全世界 座標時間(Universal Coordinated Time -- (UTC))で格納されます。 時刻については、デフォルトではサーバのタイムゾーンおけるもので あるため、クライアントのフロントエンドに送られる前に,データベース サーバ上でローカルタイムに変換されます。
タイムゾーンに影響を与えるには、いくつかの方法があります。
postmaster の開始時に,デフォルトのタイムゾーンとして直接 バックエンドにより使用される TZ 環境変数。
コネクション確立時に、タイムゾーン情報をバックエンドに対して送信 するために、クライアントにおいて libpq で使用される PGTZ 環境変数。
set timezone SQL で, セッションのタイムゾーンを設定。
無効なタイムゾーンが指定されると、(そうでなくてもほとんどの システムでは)タイムゾーンは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 8-11. Postgres日付/時刻型の特殊な定数
定数 | 説明 |
---|---|
current | 現在のトランザクション時刻。その後は変更されない。 |
epoch | 1970-01-01 00:00:00+00 Unix システムの時刻0) |
infinity | 他のすべての有効な時刻以降 |
-infinity | 他のすべての有効な時刻以前 |
invalid | 無効なエントリ |
now | 現在のトランザクション |
today | 今日の午前 0 時 |
tomorrow | 明日の午前 0 時 |
yesterday | 昨日の午前 0 時 |
汎用的な日付や時刻の入力は、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")です。 日付は内部的にはグリニッジ標準時で格納されます。入出力ルーチンは、 時刻をサーバのローカルタイムに変換します。
汎用の期間は、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)は、制限された範囲(前後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 は、制限された範囲(前後 68 年間) と制限された精度( 1 秒)をもつ期間指定データ型です。 timespan の方がより大きな範囲と精度を持つので、 これを使った方がよいでしょう。またより重要なことは、 timespan は相対的な単位(月や年)と量的な単位 (日、時など)を識別できます。 一方 reltime は、強制的にひと月をちょうど30日と換算します。 そのため、時間の計算が意図した通り動かないことがあります。 たとえば、1 相対時刻の年を絶対時刻の日に加えても、1 年先の 今日にはならず、今日から 360 日後になります。
reltime は、他の期間型と入出力ルーチンを共有しています。 このセクションの timespan で詳細が述べられています。
これは現在では、abstime データ型に非常に良く似た、制限された範囲 を持つ絶対時刻です。これは、汎用入力パーザを他の日付/時刻型と 共有しています。将来のリリースでは、この型は datetime 型の機能を吸収し、今後の SQL92 準拠に移されます。
timestamp は、datetime と同じ書式を 使って指定されます。
interval は SQL92 データ型で、 現在は timespan Postgres データ型にマッピングされています。
時刻範囲を以下のように指定します。
[ 'abstime' 'abstime' ] ここで, abstime は絶対時刻フォーマットの時刻です。特殊な abstime 値である `current'、`infinity' および `-infinity' などが使用できます。
Prev | Home | Next |
文字型 | Up | ブール型 |