付録 B. 日付/時刻のサポート

目次
B.1. 日付/時刻入力の解釈
B.2. 日付/時刻キーワード
B.3. 単位の歴史

PostgreSQL は、すべての日付/時刻入力のサポートにおいて、内蔵している発見的パーサを使用します。 日付と時刻は文字列で入力され、そのフィールドにはどのような種類の情報が入るのかが事前に決められている別個のフィールドに分割されます。 それぞれのフィールドは解釈された後、数値を割り当てられたり、無視されたり、あるいははねられたりします。 構文解析に際し、月、曜日、および時間帯を含む、すべてのテキストフィールドに対する内部参照テーブルがあります。

この付録ではこれらの参照テーブルの内容についての情報と構文解析で日付と時刻を解読する手順を説明します。

B.1. 日付/時刻入力の解釈

日付/時刻データ型はすべて以下の手順で解読されます。

  1. 入力文字列をトークンに分割し、そしてそれぞれのトークンを文字列、時刻、時間帯、または数値というように分類します。

    1. 数値トークンにコロン(:)が含まれている場合は、時刻文字列です。 そこに続くすべての数字とコロンを含みます。

    2. 数値トークンにハイフン(-)、スラッシュ(/)、または 2 つ以上のドット(.)が含まれている場合は、テキストの月名がある日付文字列です。

    3. トークンが数値だけの場合、それは単項、もしくはISO 8601の連結形式の日付(例:1999年1月13日を示す19990113)、あるいは時刻(例:14:15:16を示す141516)のいずれかです。

    4. トークンがプラス記号(+)あるいはマイナス記号(-)で始まっている場合は、時間帯フィールドか特殊なフィールドです。

  2. もしトークンがテキスト文字列の場合、以下のように可能性のある文字列と照合されます。

    1. トークンについて参照テーブルをバイナリ検索し、(todayのような)特殊文字列か、(Thursdayのような)曜日か、(Januaryのような)月か、あるいは(atonのような)ノイズかを判定します。

      フィールドの値とフィールドのビットマスクを設定します。 例えば、todayでは年、月、日を設定し、nowでは、これに追加して時、分、秒を設定します。

    2. 探索できなかった場合は同様にそのトークンに対し時間帯に一致するかどうか、参照テーブルにバイナリ検索を掛けます。

    3. それでも探し出せなかった場合、エラーを返します。

  3. トークンが数値あるいは数値フィールドの場合を以下に示します。

    1. トークンが8桁または6桁、かつ、以前に他のどのような日付フィールドも読まれていない場合は、"連結された日付"(例えば、19990118または990118)として解釈されます。 その解釈方法はYYYYMMDDまたはYYMMDDです。

    2. もしトークンが3桁で年がすでに読み込まれている場合は年内の経過日数と解釈されます。

    3. 4桁または6桁の場合で年がすでに読み込まれている時は時刻(HHMMまたはHHMMSS)と解釈されます。

    4. 3桁以上の場合、かつ、どの日付フィールドもまだ見つかっていない場合は年と解釈されます。 (この場合、残る日付フィールドの順序は強制的にyy-mm-ddと解釈されます。)

    5. さもなければ、日付フィールドの順序は、DateStyleの設定mm-dd-yy、dd-mm-yy、yy-mm-ddに従うものと仮定されます。 月や月内の日のフィールドが範囲外であれば、エラーになります。

  4. もしBCが指定された場合は内部格納用に年を負の数にして1を加えます。 (グレゴリオ暦にはゼロ年がないので、数値的には1BC(紀元前1年)がゼロ年になります。)

  5. BCが指定されず年フィールドの長さが2桁の場合、年は4桁になるよう調整されます。 そのフィールドが70未満の場合は2000が加えられますが、その他の場合には1900が加えられます。

    ティップ: (例えば、西暦99年を0099のように)グレゴリオ暦の西暦元年から99年までは、ゼロを前に付加して4桁入力することができます。 以前のバージョンのPostgreSQLでは3桁でも1桁でも入力が可能でしたが、バージョン7.0の時点で、あいまいさを減らすため規則が厳格になりました。