[11/15開催: PostgreSQL Conference Japan 2019 参加受付中] 
他のバージョンの文書 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

3.5. 日付/時刻データ型

PostgreSQLSQL の日付と時刻データ型のすべてをサポートしています。

Table 3-10. 日付/時刻データ型

説明格納サイズ最遠の過去最遠の未来精度
timestamp [ (p) ] without time zone日付と時刻両方8 バイト4713 BCAD 14650011 μ秒 / 14 桁
timestamp [ (p) ] [ with time zone ]日付と時刻両方8 バイト4713 BCAD 14650011 μ秒 / 14 桁
interval [ (p) ]日付/時刻の間隔12 バイト-178000000 years178000000 years1 μ秒
date日付のみ4 バイト4713 BC32767 AD1 日
time [ (p) ] [ without time zone ]その日の時刻のみ8 バイト00:00:00.0023:59:59.991 μ秒
time [ (p) ] with time zoneその日の時刻のみ12 バイト00:00:00.00+1223:59:59.99-121 μ秒

timetimestamp、および interval は秒フィールドに保有されている小数点以下の桁数を指定するオプションの精度値である p を受け付けます。デフォルトでは、明示的な精度に帯する限界はありません。有効な精度の限界はシステムが使用している値の保存に用いる倍精度浮動小数点値で決まります(interval では秒単位、timestamp では 2000-01-01 以降秒単位です)。有効な p の範囲は timestamp で 0 から大まかに 6 までですが、interval ではもう少し広がる可能性があります。システムは 0 から 13 までの範囲の p を受け付けます。

時間帯および時間帯の取り決めは地球の幾何学的要素のみでなく政治的判断に影響されます。世界にまたがる時間帯は 1900 年代に標準化されたようですが勝手に変更する傾向が続いています。 PostgreSQL は時間帯による出力のサポートに使用しているオペレーティングシステムの機能を使いますが、これらのシステムは通常(伝統的な Unix システムの時間の範囲に一致する)1902 年から 2038 年までの情報しか所有していません。 時間帯付の timestamp時間帯付のtime はこの期間の範囲の時間帯情報を使用し、範囲外の日付/時刻を協定世界時間 (UTC) であると推定します。

7.0 より以前の PostgreSQL バージョンからのアップグレードを確実にするために datetimetimestamp と同じ)と timespaninterval と同じ)も認めています。現在これらのデータ型は timestampinterval への暗黙的な翻訳が制限されており、次の PostgreSQL のリリース(たぶん 7.3)では削除されるでしょう。

abstimereltime は精度の低いデータ型で、内部で使用されています。新しいアプリケーションにはこれらの型の使用を避け、また適当な時に旧いものを更新してください。これらの型の一部またはすべてが今後のリリースでは削除される可能性があります。

3.5.1. 日付/時刻の入力

日付と時刻の入力は、ISO 8601SQL 互換、伝統的な PostgreSQL、その他を含むほとんどの適正と見なされるフォーマットを受け付けます。日付の入力における月と日の順序のようないずれとも解釈されるいくつかのフォーマットについてはそれらフィールドを好きな順序に指定できるようになっています。 SET DateStyle TO 'US'SET DateStyle TO 'NonEuropean' コマンドは「月→日」順表記を指定し、 SET DateStyle TO 'European' コマンドは「日→月」順表記を設定します。 ISO 形式がデフォルトとなっていますが、コンパイル時、または実行時に変更できます。

PostgreSQL は日付/時刻の運用において SQL 標準が要求するものよりも柔軟に対応します。日付/時刻の入力における正確な構文解析ルールと、月および週、そして時間帯を含む使用可能なテキストフィールドに関しては Appendix A を参照してください。

テキスト文字列のように、日付や時刻リテラルは単一引用符で囲む必要があることを思い出して下さい。詳細は Section 1.1.2.5 を参照してください。 SQL9x では下記の構文が必要です。

type [ (p) ] 'value'

ここで、オプションである精度の指定 p は秒フィールドの小数点以下の桁数に一致した整数です。精度は timetimestamp、および interval に対して設定できます。

3.5.1.1. 日付データ型

以下に date データ型で使用できる入力のいくつを示します。

Table 3-11. 日付入力

説明
January 8, 1999最も解り易すい形式
1999-01-08ISO-8601 によるフォーマット。推奨
1/8/1999U.S. 形式。ヨーロッパ形式では 8 月 1 日と識別
8/1/1999ヨーロッパ形式。U.S. 形式では 8 月 1 日と識別
1/18/1999U.S. 形式。どの形式でも 1 月 18 日
19990108ISO-8601 の年、月、日
990108ISO-8601 の年、月、日
1999.008年とその日までの累計
99008年とその日までの累計
J2451187ユリウス日
January 8, 99 BC西暦紀元前 99 年

3.5.1.2. time [ ( p ) ] [ without time zone ]

SQL99 によると、この型は time または 時間帯無しの time として指定できます。オプションの精度 p は 0 と 13 の範囲で、デフォルトは入力時刻リテラルの精度によります。

以下の time 入力が使えます。

Table 3-12. 時刻入力

説明
04:05:06.789ISO 8601
04:05:06ISO 8601
04:05ISO 8601
040506ISO 8601
04:05 AM04:05 と同じ。AM は値に影響を与えない
04:05 PM16:05 と同じ。入力時は <= 12
allballs00:00:00 と同じ

3.5.1.3. time [ ( precision ) ] with time zone

この型は SQL92 で定義されていますが、その定義は役に立つのか疑がわれる性質のものです。ほとんどの場合、datetimetimestamp without time zonetimestamp with time zone との組み合わせで、あらゆるアプリケーションで必要とされる日付/時刻の機能を提供できるはずです。

オプションの精度 p は 0 から 13 までの範囲で、デフォルトは入力時刻リテラルの精度です。

time with time zone では以下のようにして公認の時間帯を付加し time に対して制度的にに妥当とされているものを含むすべての入力を受付けます。

Table 3-13. 時間帯付き時刻入力

説明
04:05:06.789-8ISO 8601
04:05:06-08:00ISO 8601
04:05-08:00ISO 8601
040506-08ISO 8601

時間帯に関する例は Table 3-14 にもっとあります。

3.5.1.4. timestamp [ (precision) ] without time zone

timestamp [ (p) ] without time zone データ型に対しての有効な入力はは日付と時刻の連結で、オプションの AD または BC、更にオプションの時間帯が続きます。(下記を参照。)従って、

1999-01-08 04:05:06

これは ISO 準拠の timestamp without time zone の有効な値でです。また、次の広く使われるフォーマットもサポートされています。

January 8 04:05:06 1999 PST

オプションの精度 p は 0 から 13 までの範囲で、デフォルトは入力 timestamp リテラルの精度です。

timestamp without time zone に対し入力で指定された明示的な時間帯は黙って無視されます。ということは、結果の日付/時刻の値は明示された入力値の日付/時刻フィールドから持ち込まれ、時間帯に調整されていません。

3.5.1.5. timestamp [ (precision) ] with time zone

timestamp に対しての有効な入力はは日付と時刻の連結からなり、オプションの AD または BC、更にオプションの時間帯が続きます。(下記を参照。)従って、

1999-01-08 04:05:06 -8:00

これは ISO 準拠の timestamp の有効な値でです。また、次の広く使われるフォーマットもサポートされています。

January 8 04:05:06 1999 PST

オプションの精度 p は 0 から 13 までの範囲で、デフォルトは入力 timestamp リテラルの精度です。

Table 3-14. 時間帯入力

時間帯説明
PST太平洋標準時
-8:00PST の ISO-8601 からの隔たり
-800>PST の ISO-8601 からの隔たり
-8>PST の ISO-8601 からの隔たり

3.5.1.6. interval [ ( precision ) ]

interval の値は以下の構文で書くことができます。

  Quantity Unit [Quantity Unit...] [Direction]
@ Quantity Unit [Quantity Unit...] [Direction]

ここで、Quantity は(符号付き)時間量、Unit(単位)10 年単位世紀ミレニアム あるいはこれらの単位の簡略形または複数形です。 Direction(方向)ago もしくは空です。アットマーク(@)はオプションで付けても付けなくても構いません。異なる単位における時間量は適切な符号付き計算値で明示的に付加されなければなりません。

日、時、分、および秒の時間量は明示的に単位を指名しないでも構いません。例えば、'1 12:59:10''1 日と 12 時間 59 分 10 秒' と同じです。

オプションの精度 p は 0 から 13 までの範囲で、デフォルトは入力リテラルの精度です。

3.5.1.7. 特殊な値

SQL 互換の関数、CURRENT_DATECURRENT_TIMECURRENT_TIMESTAMPを対応するデータ型の日付または時間の入力に使用できます。

PostgreSQLでは、便宜をはかるために特殊な定数をサポートしています。

Table 3-15. 特殊な日付/時刻定数

定数説明
epoch1970-01-01 00:00:00+00 (Unix システムの基準時刻)
infinity別の有効な時刻よりも後
-infinity別の有効な時刻より前
invalid無効な入力
now現トランザクションの時刻
today今日の始まり
tomorrow明日の始まり
yesterday昨日の始まり
zulu, allballs, z00:00:00.00 GMT
'now' は値が始めて解釈されたときに評価されます。

Note: PostgreSQL のバージョンが 7.2 になった時点で 「current」 は日付/時刻定数としてもはやサポートされていません。以前は、「current」 は特殊値として保存され、式またはデータ型の変換時にのみ 'now' に対して評価されました。

3.5.2. 日付/時刻出力

出力フォーマットは、SET DateStyle コマンドを使用して ISO 8601、SQL(Ingres)、伝統的な PostgreSQL、German のいずれかに設定することができます。デフォルトは ISO フォーマットとなっています。

Table 3-16. 日付/時刻出力形式

形式仕様説明
'ISO'ISO-8601 標準1997-12-17 07:37:16-08
'SQL'伝統的な形式12/17/1997 07:37:16.00 PST
'PostgreSQL'特有の形式Wed Dec 17 07:37:16 1997 PST
'German'地域限定形式17.12.1997 07:37:16.00 PST

datetime の形式はいうまでもなく上記の例に基づいた日付と時刻の部分です。

SQL 形式にはヨーロッパとヨーロッパでない(米国)変形があって、月の後に日なのか、それともその逆なのかを決定します。(この設定が入力値の解釈にどう影響を与えるのかについては Section 3.5.1 も参考にしてください。)

Table 3-17. 日付の順序の慣習

形式仕様説明
European//17/12/1997 15:37:16.00 MET
US//12/17/1997 07:37:16.00 PST

interval の出力は あるいは 世紀が 年と日に変換される以外、入力フォーマットと同じように表現されます。ISO モードでの出力は以下のようになります。

[ Quantity Units [ ... ] ] [ Days ] Hours:Minutes [ ago ]

日付/時刻データ型の出力形式を決めるのにいくつかの方法があります。

3.5.3. 時間帯

PostgreSQL は汎用的に使用できるように SQL92 への互換性に対し最大限の努力をしています。しかし、SQL92 標準には、日付と時刻データ型および効能にたいして妙に混乱しています。2 つの明らかな問題点を以下に示します。

このような問題を解決するためには時間帯を使用する際、日付と時刻の両方を保持できる日付/時刻データ型を使うべきでしょう。(たとえ PostgreSQL が過去のアプリケーションのためにサポートしているから、さらに他の RDBMS の実装との互換性を持たせたいからとしても)SQL92 形式の 時間帯付き time の使用はお勧めしませんPostgreSQL は、日付または時刻のみを保持しているいかなるデータ型に対しても使用している時間帯をそのまま使います。さらに、時間帯のサポートは使用しているオペレーティングシステムの時間帯機能を使用しているため、夏時間やその他の機能を処理できます。

PostgreSQL は(Unix 系システムの典型的な日付の限界の近辺である)1902 年から 2038 年までの間は、使用しているオペレーティングシステムが提供する時間帯を獲得します。この範囲以外のすべての日付は協定世界時間 (UTC:Universal Coordinated Time)が指定されたものと仮定され、そして使用されます。

すべての日付と時刻は伝統的にグリニッジ標準時(GMT)として知られているUTC で内部的に保存されます。時刻はクライアントフロントエンドに送られる前にデータベースサーバの地域時刻に変換されるため、サーバでの時間帯がデフォルトになります。

いくつかの方法で時間帯を操作できます。

Note: 無効な時間帯が指定された場合(ほとんどのシステムで)時間帯はGMT になります。

Note: 実行時オプションに AUSTRALIAN_TIMEZONES が設定された場合、 CSTEST は米国時間帯でなくオーストラリア時間帯を参照します。

3.5.4. 内部形式

PostgreSQL はすべての日付と時刻の計算にユリウス暦を使っています。これは、紀元前 4,713 年から未来までのすべての日付を、1 年は 365.2425 日であると仮定し正確な予測や計算をするという優れた特性を持っています。

19 世紀以前の日付規則はおもしろい読み物にはなりますが、日付/時刻ハンドラの正しいコーディングを保証するは整合性につき完璧ではありません。