項8.5.3を参照してください。(他にAD/BCを時間帯の前に付ける方法もありますが、これは推奨される順序ではありません)。8601に準拠しています。PSTという書式もサポートされます。zoneのリテラルを"+"もしくは"-"の有無で区別しています。PostgreSQLは、その型が決まる前に文字列リテラルの内容を検証しません。10:23:54+02'のように正しい明示的な型を指定してください。zoneと決定済みのリテラルでは、PostgreSQLは警告なく時間帯情報をすべて無視します。結果の値は明示された入力値の日付/時刻フィールドから持ち込まれますが、時間帯の調整はなされません。グリニッジ標準時GMTとして知られています)。時間帯が明示的に指定された入力値は、その時間帯に適したオフセットを使用してUTCに変換されます。入力文字列に時間帯が指定されていない場合は、システムのtimezoneパラメータに示されている値が時間帯とみなされ、timezone時間帯用のオフセットを使用してUTCに変換されます。zone値が出力されると、この値はUTCから現行のtimezoneに変換され、その時間帯のローカル時間として表示されます。zone値はtimezoneローカル時間としてみなされる、または、指定されるものと想定されます。ZONEを使用する変換では、異なる時間帯参照を指定できます。時間間隔intervalの値は以下の構文で書くことができます。[direction]ここで、quantityは(符号付き)時間量、unit(単位)はmicrosecond、millisecond、second(秒)、minute(分)、hour(時)、day(日)、week(週)、month(月)、year(年)、decade(10年単位)、century(100年単位)、millennium(1000年単位)あるいはこれらの単位の簡略形または複数形です。direction(方向)はagoもしくは空です。アットマーク(@)はオプションで、付けても付けなくても構いません。異なる単位における時間量は適切に符号を考慮して暗黙的に足されます。日、時、分、および秒の時間量は明示的に単位を指定しなくても構いません。12:59:10'は'1日と12時間59分10秒'と解釈されます。秒以下のオプションの精度pは0から6までの範囲で、デフォルトは入力リテラルの精度です。内部的には、intervalの値は月数、日数および秒数として格納されています。ある月の日数は月によって変わりますし、夏時間が導入されていると1日が23時間であったり25時間であったりするからです。時間間隔は通常定数列、もしくはtimestampからの引き算で生成されますので、この様に保存すればほとんどの場合うまく行きます。justify_daysとjustify_hours関数で通常の範囲を越えた日にちと時刻を調整できます。特殊な値PostgreSQLでは利便性のために、表8-13に示されているような特別な日付/時刻入力値をサポートしています。infinityと-infinityの値は、特別にシステム内部で表現され、同じように表示されます。(特にnowとその関連文字列は読み込まれるとすぐにその時点の値に変換されます)。これらの値は全て、SQLコマンドで定数として使う場合は、単一引用符で括らなければなりません。UTCSQL互換の関数である、CURRENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMP、LOCALTIME、LOCALTIMESTAMPも、対応するデータ型の日付または時間の値として使用できます。これらはSQL関数であり、データ入力文字列としては認識されないことに注意してください。8601、SQL(Ingres)、伝統的なPOSTGRES、Germanのいずれかに設定することができます。8601書式の使用が定められています。"SQL"出力書式名は偶然のものです)。表8-14に各出力書式の例を示します。dateとtimeの書式は、言うまでもなく示された例のそれぞれ日付と時刻の部分となります。PSTSQLとPOSTGRESでは、DMYフィールド順が指定された場合は月の前に日が現れます。(この設定が入力値の解釈にどう影響を与えるのかについては項8.5.1を参考にしてください)。表8-15に例を示します。PSTintervalの出力はcenturyやweekといった単位が年と日に変換される点とagoが適切な符号に変換される点を除き、入力書式と同じように表現されます。ISOモードでの出力は以下のようになります。DATESTYLEコマンド、postgresql.conf構成ファイルのDateStyleパラメータ、そしてサーバかクライアントのPGDATESTYLE環境変数を使用して、日付/時刻の様式を選択することができます。日付/時刻出力のより柔軟な書式設定方法として、書式設定関数to_char(項9.8を参照)を使用することもできます。時間帯および時間帯の取り決めは地球の幾何学的要素のみでなく政治的判断に影響されます。世界にまたがる時間帯は1900年代に標準化されたようですが、特に夏時間規則の点で、勝手に変更する傾向が続いています。PostgreSQLは現在、(伝統的なUnixシステム時間の範囲に一致する)1902年から2038年までの期間について夏時間規則をサポートします。範囲外の日付/時刻は選択された時間帯の"標準時間"で表されたものとみなします。何年になったら失敗するということを心配する必要はありません。PostgreSQLは汎用的に使用できるように標準SQLへの互換性に対し最大限の努力をしています。標準SQLには、日付と時刻のデータ型と機能に関する混乱が見受けられます。2つの明らかな問題点を以下に示します。date型にはそれに関連する時間帯がありませんが、time型にはあります。現実の世界において、時間帯のオフセットが夏時間への切り替えにより年間を通じて変化することから、時刻と同様に日付もそれに結び付けられていないと意味がありません。デフォルトの時間帯はUTCからの整数定数オフセットとして指定されています。したがってDST(夏時間)への切り替えをまたいで日付/時刻演算を行う場合、夏時間を適用することはできません。このような問題を解決するためには、時間帯を使用する際に日付と時刻の両方を保持できる日付/時刻データ型を使用することを勧めます。zone型の使用をサポートしています)。PostgreSQLは、日付または時刻のみを保持するデータ型の全ては使用中の時間帯であると前提しています。全ての時間帯付きの日付と時刻はUTCで内部的に保存されます。これらはクライアントに表示される前にtimezone設定パラメータで指定された時間帯におけるローカル時間に変換されます。PostgreSQLでは、3つの形式で時間帯を指定することができます。America/New_Yorkなどの完全な時間帯名称。認識できる時間帯名称はpg_timezone_namesビューに列挙されています(項44.56を参照してください)。PostgreSQLはこの目的のためによく使用されているzic時間帯データを使用します。したがって、多くの他のソフトウェアでも同じ名前が認識されます。PSTなどの時間帯省略形。した指定は、単に特定のUTCからのオフセットを定義します。完全な時間帯名称では夏時間遷移規則群も組み込まれている可能性があります。認識可能な省略形はpg_timezone_abbrevsビューに列挙されています(項44.55を参照してください)。ZONE演算子に省略形を使用することができます。時間帯名やその省略形に加え、PostgreSQLは、STDoffsetやSTDoffsetDSTという形式のPOSIX様式の時間帯指定を受付けます。ここで、STDは時間帯省略形、offsetはUTCから西に数えた時間単位のオフセットです。DSTは省略可能で夏時間時間帯の省略形で、指定オフセットから1時間進むことを意味します。EST5EDTが認識済みの時間帯名でない場合でも、受付けられ、USA西海岸時間と同じものとして動作します。夏時間時間帯名があると、zic時間帯データベースのposixrules項目で使用される夏時間変換規則と同じ規則に従って使用されるものと前提されます。標準的なPostgreSQLインストレーションでは、posixrulesはUS/Easternと同じです。このためPOSIX書式の時間帯指定はUSA夏時間規則に従います。必要に応じてposixrulesファイルを置き換えることで、この動作を調整することができます。省略形と省略なしの名称の間には概念的および実質的な差異があります。省略形はUTCから固定したオフセットを表わすのに対して、ほとんどの省略なしの名称はローカルの夏時間規定を意味するので、UTCオフセットには2つの可能性があります。時間帯省略系の正当性を検査しないため、POSIX書式時間帯機能ではおかしな入力を警告なく受け付けてしまう可能性があることに注意すべきです。FOOBAR0でも動作します。他にも、POSIX時間帯名称では正のオフセットがグリニッジの西側で使用されるという問題には注意しなければなりません。PostgreSQLは、他ではすべてISO-8601規約にしたがい、正の時間帯オフセットはグリニッジの東としています。全ての場合において、時間帯名は大文字小文字の区別なく認識されます。(これはPostgreSQLのバージョン8.2以前からの変更で、全てではありませんが、ある文脈では大文字小文字が区別されました。)省略なし、省略形のどちらもサーバ内に組み込まれるわけではありません。.../share/timezonesets/の下に保存される構成ファイルから取得されます(項B.3を参照ください)。timezoneはpostgresql.confファイルや第18章で説明する他の標準的な方法で設定することができます。以下に、いくつか特別な設定方法を示します。postgresql.conf内やサーバのコマンドラインスイッチでtimezoneが指定されていない場合、デフォルトの時間帯としてTZ環境変数の値を使用しようと試みます。TZが定義されていない場合やTZがPostgreSQLで認識可能な時間帯名称でなかった場合、サーバは、localtime()Cライブラリ関数の動作を検査することでオペレーティングシステムのデフォルトの時間帯を決定しようと試みます。このデフォルトの時間帯は、PostgreSQLが認識可能な時間帯の中から最も近いものが選択されます。(こうした規則は、log_timezoneが指定されていない場合のデフォルト値の選択方法でも使われます。SQLコマンドはセッションの時間帯を設定します。ZONEコマンドをlibpqアプリケーションが送信します。内部PostgreSQLは全ての日付と時刻の計算にユリウス日を使っています。これは、紀元前4,713年から未来までの全ての日付を、1年は365.2425日であると仮定し正確な予測や計算をするという優れた特性を持っています。19世紀以前の日付規則はおもしろい読み物にはなりますが、日付/時刻ハンドラの正しいコーディングを保証することは整合性について完璧ではありません。