時間帯を参照してください。タイムスタンプタイムスタンプ型への有効な入力は、日付と時刻を連結し、さらにその後にオプションで時間帯、その後にオプションでADもしくはBCからなります。(他にAD/BCを時間帯の前に付ける方法もありますが、これは推奨される順序ではありません。8601に準拠しています。PSTという書式もサポートされます。zoneのリテラルを、時刻の後の「+」もしくは「-」記号と時間帯補正の有無により区別します。PostgreSQLでは、その型を決める前に文字列リテラルの内容を検証しません。zoneとして扱います。10:23:54+02'のように正しい明示的な型を指定してください。zoneと決定済みのリテラルでは、PostgreSQLは警告なく時間帯情報をすべて無視します。結果の値は明示された入力値の日付/時刻フィールドから持ち込まれますが、時間帯の調整はなされません。グリニッジ標準時GMTとして知られています)。時間帯が明示的に指定された入力値は、その時間帯に適したオフセットを使用してUTCに変換されます。入力文字列に時間帯が指定されていない場合は、システムのTimeZoneパラメータに示されている値が時間帯とみなされ、timezone時間帯用のオフセットを使用してUTCに変換されます。zoneの値が出力されると、この値はUTCから現行のtimezoneに変換され、その時間帯のローカル時間として表示されます。zoneの値はtimezoneのローカル時間としてみなされる、または、指定されるものと想定されます。ZONEを使用する変換では、異なる時間帯を指定できます。特別な値PostgreSQLでは利便性のために、表8.13「特別な日付/時刻定数」に示されているような特別な日付/時刻入力値をサポートしています。infinityと-infinityの値は、特別にシステム内部で表現され、変更されずに表示されます。他のものは、単に簡略化された表記で、読み込まれるときに通常の日付/時刻値に変換されます。(特にnowとその関連文字列は読み込まれるとすぐにその時点の値に変換されます。これらの値はすべて、SQLコマンドで定数として使う場合は、単一引用符でくくらなければなりません。UTCSQL互換の関数である、CURRENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMP、LOCALTIME、LOCALTIMESTAMPも、対応するデータ型の現在の日付または時間の値を取得するために使用できます。後の4つでは、オプションとして秒以下の精度指定が可能です。これらはSQL関数であり、データ入力文字列として認識されないことに注意してください。date書式)またはGermanの4つのいずれかに設定できます。デフォルトはISO書式です。8601書式の使用が定められています。「SQL」という出力書式名は歴史的な事故です。表8.14「日付/時刻の出力形式」に各出力書式の例を示します。dateとtimeの書式は、例にあるとおり、それぞれ日付と時刻の部分です。POSTGRESではISO書式の日付部分のみを出力します。(YMDやMDYの場合12-17-1997を返し、DMYの場合17-12-1997を返します。8601の仕様では日付と時刻を区切るために大文字のTを使用します。PostgreSQLは入力ではこの書式を受け付けますが、上記のように出力ではTではなく空白を使用します。これは読みやすさのため、そしてRFC3339や他のデータベースシステムとの整合性を保つためです。SQLとPOSTGRESでは、DMYフィールド順が指定された場合は月の前に日が現れます。指定がなければ日の前に月が現れます。日付/時刻の入力を参考にしてください)。表8.15「日付の順序の慣習」に例を示します。DATESTYLEコマンド、postgresql.conf構成ファイルのDateStyleパラメータ、そしてサーバかクライアントのPGDATESTYLE環境変数を使用して、日付/時刻の様式を選択することができます。データ型書式設定関数を参照)を使用することもできます。時間帯および時間帯の取り決めは地球の幾何学的要素のみでなく政治的決定に影響されます。世界にまたがる時間帯は1900年代に標準化されたようですが、特に夏時間規則の点で、勝手に変更する傾向が続いています。PostgreSQLは歴史的な時間帯ルールについての情報に、広く使われているIANA時間帯データベースを使用します。将来の時間は、ある与えられた時間帯に対する最新の既知のルールが、将来長きに渡りそのまま遵守が継続されるということを前提としています。PostgreSQLは典型的な使用法については標準SQLへの互換性に対し最大限の努力をしています。標準SQLには、日付と時刻のデータ型と機能に関する混乱が見受けられます。2つの明らかな問題点を以下に示します。date型にはそれに関連する時間帯を持てませんが、time型にはあります。現実の世界において、時間帯のオフセットが夏時間への切り替えにより年間を通じて変化することから、時刻と同様に日付もそれに結び付けられていないと意味がありません。デフォルトの時間帯はUTCからの整数定数オフセットとして指定されています。したがってDST(夏時間)への切り替えをまたいで日付/時刻演算を行う場合、夏時間を適用することは不可能です。このような問題を解決するためには、時間帯を使用する際に日付と時刻の両方を保持できる日付/時刻データ型を使用することを勧めます。zone型の使用をサポートしています)。PostgreSQLは、日付または時刻のみを保持するデータ型のすべては使用中の時間帯であると前提しています。すべての時間帯付きの日付と時刻はUTCで内部的に保存されます。これらはクライアントに表示される前にTimeZone設定パラメータで指定された時間帯におけるローカル時間に変換されます。PostgreSQLでは、3つの形式で時間帯を指定することができます。America/New_Yorkなどの完全な時間帯名称。pg_timezone_namesを参照してください)。PostgreSQLはこの目的のためによく使用されているIANA時間帯データを使用します。したがって、多くの他のソフトウェアでも同じ名前が認識されます。PSTなどの時間帯省略形。した指定は、単に特定のUTCからのオフセットを定義します。完全な時間帯名称では夏時間遷移規則群も組み込まれます。pg_timezone_abbrevsを参照してください)。ZONE演算子に省略形を使用することができます。時間帯名やその省略形に加え、PostgreSQLは、STDoffsetやSTDoffsetDSTという形式のPOSIX様式の時間帯指定を受付けます。ここで、STDは時間帯省略形、offsetはUTCから西に数えた時間単位のオフセットです。オプションで夏時間時間帯の省略形のDSTを指定すると、指定オフセットから1時間進むものとみなされます。同じものとして動作します。この構文では、時間帯の短縮は文字列、あるいは任意の文字列を山括弧(<>)で括ったもので指定できます。夏時間帯の省略名があると、IANA時間帯データベースのposixrules項目で使用される夏時間変換規則と同じ規則に従って使用されるものとみなされます。標準的なPostgreSQLインストレーションでは、posixrulesはUS/Easternと同じです。このためPOSIX書式の時間帯指定は米国の夏時間規則に従います。必要に応じてposixrulesファイルを置き換えることで、この動作を調整することができます。一言で言うと、これは省略形と正式名称との差異です。省略形はUTCから固定したオフセットを表わすのに対して、多くの正式名称はローカルの夏時間規定を暗示するので、2つのUTCオフセットがあるかもしれません。America/New_Yorkはニューヨークの正午を示しますが、これはこの日について言えば東部夏時間(UTC-4)です。EDTはこれと同時刻を示します。ESTは、その日に夏時間が使用されていたかどうかに関わらず、東部標準時間(UTC-5)での正午を示します。問題を更に複雑にしているのは、一部の管轄は同じ略号を使って、年によって異なるUTCオフセットを表していることです。モスクワではMSKはある年ではUTC+3を意味しますが、別の年ではUTC+4を意味します。PostgreSQLではそのような略号について、指定の日に何を意味していたか(あるいは最も最近にどういう意味だったか)に従って解釈します。ESTの例にあるように、必ずしもその日付における地方常用時を示しているとは限りません。時間帯省略形の正当性を検査しないため、POSIX書式時間帯機能ではおかしな入力を警告なく受け付けてしまう可能性があることに注意すべきです。FOOBAR0でも動作します。このとき、システムは事実上、UTCについての奇妙な省略形を使用する状態になります。他にも、POSIX時間帯名称では正のオフセットがグリニッジの西側で使用されるという問題には注意しなければなりません。PostgreSQLは、他ではすべてISO-8601規約にしたがい、正の時間帯オフセットはグリニッジの東としています。すべての場合において、時間帯名や略号は大文字小文字の区別なく認識されます。(これはPostgreSQLの8.2より前のバージョンからの変更です。以前は、文脈によって大文字小文字が区別される場合と、されない場合がありました。)時間帯名、省略形のどちらもサーバ内に組み込まれるわけではありません。日付/時刻設定ファイルを参照ください)。TimeZoneはpostgresql.confファイルや18章サーバの設定で説明する他の標準的な方法で設定することができます。以下に、いくつか特別な設定方法を示します。ZONEはセッションの時間帯を設定します。TOの別名ですが、SQL仕様の構文へのより高い互換性があります。ZONEコマンドを送信するために用いられます。時間間隔の入力interval値は以下の冗長な構文を使って記述されます。[direction]ここで、quantityは(符号付き)時間量、unit(単位)はmicrosecond、millisecond、second(秒)、minute(分)、hour(時)、day(日)、week(週)、month(月)、year(年)、decade(10年単位)、century(100年単位)、millennium(1000年単位)あるいはこれらの単位の簡略形または複数形です。direction(方向)はagoもしくは空です。アットマーク(@)はオプションで、付けても付けなくても構いません。異なる単位における時間量は適切に符号を考慮して暗黙的に足されます。agoはすべてのフィールドの正負を逆にします。この構文はまた、IntervalStyleがpostgres_verboseに設定されている場合に時間間隔の出力でも使用されます。日、時、分、および秒の時間量は明示的に単位を指定しなくても構いません。sec'(1日と12時間59分10秒)と解釈されます。年と月の組み合わせはダッシュを使って指定することができます。months'(200年と10か月)と解釈されます。(実際のところ、標準SQLで許されている簡略形はこれらだけです。IntervalStyleがsql_standardに設定されている場合には、これらが出力で使用されます。8601時間間隔として書くこともできます。指定文字付の書式は以下のようなものです。...]]文字列はPで始まらなければならず、また、日と時間を区切るTを含めることができます。8601における時間間隔単位の省略形」に示します。単位は省略しても構いませんし、任意の順番で指定できますが、1日より小さな単位はTの後に書かなければなりません。Mの意味はTの前にあるか後にあるかに依存します。]上の代替書式では、文字列はPから始まらなければなりません。Tは時間間隔の日付部分と時刻部分とを分割します。8601日付と同様の数字で指定されます。fields指定を使って時間間隔定数を記述する場合、または、fields仕様で定義された時間間隔列に文字列を割り当てる場合、マークされていない時間量の解釈はfieldsに依存します。'1'は1秒と解釈されます。同時に、fields仕様によって許可される最下位フィールドの「右側の」フィールド値は警告なしに破棄されます。MINUTEと書くことで、二番目のフィールドは削除されますが、日付フィールドは削除されません。標準SQLに従うと、時間間隔値のフィールドはすべて同じ符号を持たなければなりません。このため、先頭の負の符号はすべてのフィールドに適用されます。2:03:04'の負の符号は、日付部分にも時、分、秒部分にも適用されます。PostgreSQLではフィールドに異なる符号を持たせることができます。伝統的にテキスト形式表現における各フィールドは独立した符号を持つものとして扱われます。このため、この例では時、分、秒部分は正であるとみなされます。IntervalStyleがsql_standardに設定されている場合、先頭の符号はすべてのフィールドに適用されるものとみなされます(ただし他に符号がない場合のみです)。なくば、伝統的なPostgreSQLの解釈が使用されます。あいまいさを防ぐために、負のフィールドがある場合には個別に明示的な符号を付けることを勧めます。内部的には、intervalの値は月数、日数および秒数として格納されています。ある月の日数は月によって変わりますし、夏時間が導入されていると1日が23時間であったり25時間であったりするからです。月数と日数フィールドは整数ですが、秒数フィールドは小数を保管することができます。時間間隔は通常定数列、もしくはtimestampからの引き算で生成されますので、このように保存すればほとんどの場合うまく行きます。justify_daysとjustify_hours関数で通常の範囲を越えた日にちと時刻を調整できます。冗長な入力書式、および、より簡略な書式の一部のフィールドでは、フィールド値は小数部分を持つことができます。week'や'01:02:03.45'です。した入力は格納の際適切な月数、日数、秒数に変換されます。これが月または日数が小数になる結果となる場合、小数部分は1月は30日、1日は24時間という変換規則を使用して、より低い順のフィールドに加えられます。month'は1月と15日となります。秒だけが出力において小数を示すことになります。表8.17「時間間隔入力」は有効なinterval入力のいくつかの例を示しています。