5.5. 日付/時刻データ型

PostgreSQL では、Table 5-9 に示されている SQL の日付と時刻データ型のすべてがサポートされています。

Table 5-9. 日付/時刻データ型

説明格納サイズ最遠の過去最遠の未来精度
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 を受け付けます。デフォルトでは、明示的な精度に対する限界はありません。 許容される範囲 p は、timestamp 型と interval 型の場合は 0 から 6 で、time 型の場合は 0 から 13 です。

Note: timestamp は 2000-01-01 以降の秒数で格納されているので、timestamp 値が倍精度浮動小数点として格納される場合 (現在はこれがデフォルトです)、効果的な精度の限界は 6 未満でしょう。2000-01-01 以降 2、3 年の日付に関してはマイクロセカンドの精度が実現されますが、それより遠い日付になると精度は低くなります。 タイムスタンプが (コンパイル時のオプションで) 8 バイト整数として格納される場合には、すべての範囲の値についてマイクロセカンドの精度が実現されます。

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

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

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

5.5.1. 日付/時刻の入力

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

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

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

type [ (p) ] 'value'

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

5.5.1.1. 日付

Table 5-10date 型で入力可能なものをリストしています。

Table 5-10. 日付入力

説明
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 年

5.5.1.2. 時刻

time 型は、time または time without time zone として指定できます。オプションの精度 p は 0 から 13 までの範囲で、デフォルトは入力時刻リテラルの精度です。

Table 5-11 は、入力可能な time 型を示しています。

Table 5-11. 時刻入力

説明
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 と同じ

time with time zone 型は Table 5-12 のようにして公認の時間帯を付加し time 型に対して妥当とされているすべての入力を受付けます。

Table 5-12. 時間帯付き時刻入力

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

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

5.5.1.3. タイムスタンプ

タイムスタンプ型には、timestamp [ (p) ] without time zonetimestamp [ (p) ] with time zone があります。 単に timestamp と入力すると、timestamp without time zone と同じことになります。

Note: PostgreSQL の 7.3 より前のバージョンでは、単に timestamp と入力することは timestamp with time zone と同じでした。 これは SQL 標準に合わせ変更されました。

timestamp に対する有効な入力は連結した日付と時刻からなり、その後ろにオプションの AD または BC、更にその後ろにオプションの時間帯が続きます。Table 5-13 を参照。よって、以下のようになります。

1999-01-08 04:05:06

および

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

は有効な値で、ISO 8601 に準拠しています。 また、広く使用されている

January 8 04:05:06 1999 PST

形式もサポートされています。

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

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

timestamp with time zone について内部に格納されている値は常に UTC (GMT) です。 時間帯が明示的に指定された入力値は、その時間帯に適したオフセットを使用して UTC に変換されます。 入力文字列に時間帯が指定されていない場合は、システムの TimeZone パラメータに示されている値が時間帯とみなされ、TimeZone 時間帯用のオフセットを使用して UTC に変換されます。

timestamp with time zone 値が出力されると、この値は UTC から現行の TimeZone に変換され、その時間帯のローカル時間として表示されます。 他の時間帯での時間を表示するには、TimeZone を変更するか、あるいは AT TIME ZONE 構文を使用します (Section 6.8.3 を参照)。

timestamp without time zonetimestamp with time zone 間の変換では、通常 timestamp without time zone 値は TimeZone ローカル時間としてみなされる (または指定される) ものと想定されます。 AT TIME ZONE を使用する変換では、異なる時間帯参照を指定できます。

Table 5-13. 時間帯入力

時間帯説明
PSTPacific Standard Time(米国太平洋標準時間)
-8:00>PST の ISO-8601 からの隔たり
-800>PST の ISO-8601 からの隔たり
-8>PST の ISO-8601 からの隔たり

5.5.1.4. 間隔

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 から 6 までの範囲で、デフォルトは入力リテラルの精度です。

5.5.1.5. 特殊な値

SQL 互換の関数、CURRENT_DATECURRENT_TIMECURRENT_TIMESTAMPを、対応するデータ型の日付または時間の値として使用できます。 後の 2 つでは、オプションとして精度指定が可能です。 (Section 6.8.4 も参照)。

PostgreSQL では利便性のために、Table 5-14 に示されているような特別な日付/時刻入力値もサポートしています。 infinity-infinity の値は、特別にシステム内部で表現され、同じように表示されます。他のものは、単に簡略化された表記で、読み込まれる際には通常の日付/時刻値に変換されます。

Table 5-14. 特殊な日付/時刻定数

入力文字列説明
epoch1970-01-01 00:00:00+00 (Unix システムの基準時刻)
infinity他のすべてのタイムスタンプより遅い日付/時刻 (date 型では使用不可)
-infinity他のすべてのタイムスタンプより早い日付/時刻 (date 型では使用不可)
now現トランザクションの時刻
today今日の始まり
tomorrow明日の始まり
yesterday昨日の始まり
zulu, allballs, z00:00:00.00 GMT

5.5.2. 日付/時刻出力

出力フォーマットは、SET DateStyle コマンドを使用して ISO 8601、SQL(Ingres)、伝統的な PostgreSQL、German のいずれかに設定することができます。デフォルトは ISO フォーマットとなっています。 (SQL では ISO 8601 形式の使用が定められています。 "SQL" 出力形式の名前は偶然のものです。) Table 5-15 に各出力形式の例を示します。 datetime の形式はいうまでもなく、示された例のそれぞれ日付と時刻の部分となります。

Table 5-15. 日付/時刻出力形式

形式仕様説明
ISOISO 8601/SQL 標準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

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

Table 5-16. 日付の順序の慣習

形式仕様説明
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 ]

ユーザは SET DATESTYLE コマンド、postgresql.conf 構成ファイルの datestyle パラメータ、そしてサーバかクライアントの PGDATESTYLE 環境変数を使用して、日付/時刻の形式を選択することができます。 日付/時刻出力のより柔軟なフォーマット方法として、関数 to_char (Section 6.7 を参照) を使用することもできます。

5.5.3. 時間帯

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

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

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

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

サーバで使用する時間帯を選択する方法はいくつかあります。

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

使用可能な時間帯については、Appendix A を参照してください。

5.5.4. 内部形式

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

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