PostgreSQLでは、表 8.9に示されているSQLの日付と時刻データ型のすべてがサポートされています。 これらのデータ型で利用できる演算については9.9で説明します。 グレゴリオ暦が導入されるより前の年であっても(B.6参照)、日付はグレゴリオ暦にしたがって計算されます。
表8.9 日付/時刻データ型
| 型名 | 格納サイズ | 説明 | 最遠の過去 | 最遠の未来 | 精度 |
|---|---|---|---|---|---|
timestamp [ ( | 8 バイト | 日付と時刻両方(時間帯なし) | 4713 BC | 294276 AD | 1マイクロ秒 |
timestamp [ ( | 8バイト | 日付と時刻両方、時間帯付き | 4713 BC | 294276 AD | 1マイクロ秒 |
date | 4バイト | 日付(時刻なし) | 4713 BC | 5874897 AD | 1日 |
time [ ( | 8バイト | 時刻(日付なし) | 00:00:00 | 24:00:00 | 1マイクロ秒 |
time [ ( | 12 バイト | 時刻(日付なし)、時間帯付き | 00:00:00+1559 | 24:00:00-1559 | 1 マイクロ秒 |
interval [ | 16バイト | 時間間隔 | -178000000年 | 178000000年 | 1マイクロ秒 |
標準SQLでは、単なるtimestampという記述はtimestamp without time zoneと同じであることを要求します。
PostgreSQLはこれに準じます。
timestamp with time zoneはtimestamptzと省略することができますが、これはPostgreSQLの拡張です。
time、timestampおよびintervalは秒フィールドに保有されている小数点以下の桁数を指定する精度値pをオプションで受け付けます。
デフォルトでは、精度についての明示的な限界はありません。
pの許容範囲は0から6です。
intervalデータ型には追加のオプションがあり、以下の1つの語句を使用して格納されるフィールドの集合を制約します。
YEAR MONTH DAY HOUR MINUTE SECOND YEAR TO MONTH DAY TO HOUR DAY TO MINUTE DAY TO SECOND HOUR TO MINUTE HOUR TO SECOND MINUTE TO SECOND
fieldsおよびpが共に指定されると、精度は秒のみに適用されるので、fieldsはSECONDを含まなければならないことに注意してください。
time with time zoneは標準SQLで定義されていますが、その定義は、その有用性を疑問視することになりかねない特性を示しています。
ほとんどの場合、date、time、timestamp without time zone、timestamp with time zoneの組み合わせで、すべてのアプリケーションで要求される日付/時刻機能すべてを提供しているはずです。
日付と時刻の入力は、ISO 8601、SQL互換、伝統的なPOSTGRES、その他を含むほとんどの適正とみなされる書式を受け付けます。
一部の書式では日付の入力における日-月-年の順序が曖昧ですが、これらのフィールドの期待される順序を指定する方式が提供されています。
DateStyleパラメータをMDYに設定すれば、月日年という順で解釈され、DMYに設定すれば日月年という順で、YMDに設定すれば年月日という順で解釈されます。
PostgreSQLは日付/時刻入力の取扱いにおいて標準SQLの要求よりも柔軟です。 日付/時刻の入力における厳密な構文解析規則と、月および週、そして時間帯を含む使用可能なテキストフィールドに関しては付録Bを参照してください。
日付や時刻リテラルの入力では、テキスト文字列のように、単一引用符で囲む必要があることを思い出してください。 詳細は4.1.2.7を参照してください。 SQLでは下記の構文が要求されます。
type[ (p) ] 'value'
ここで、pは秒フィールドの小数点以下の桁数を与えるオプションの精度の指定です。
精度はtime、timestampおよびinterval型に対して0から6の範囲で設定できます。
値の許容範囲は既に説明しています。
定数指定において精度指定がない場合は、リテラル値の精度がデフォルトとして使われます(ただし、6桁を超えることはありません)。
表 8.10はdate型で入力可能なものの一部を示します。
表8.10 日付入力
| 例 | 説明 |
|---|---|
| 1999-01-08 | ISO 8601。すべてのモードで1月8日になります(推奨書式)。 |
| January 8, 1999 | すべてのdatestyle入力モードにおいて曖昧さがありません。 |
| 1/8/1999 | MDYモードでは1月8日、DMYモードでは8月1日。 |
| 1/18/1999 | MDYモードでは1月18日、他のモードでは拒絶されます。 |
| 01/02/03 |
MDYモードでは2003年1月2日、DMYモードでは2003年2月1日、YMDモードでは2001年2月3日。
|
| 1999-Jan-08 | すべてのモードで1月8日になります。 |
| Jan-08-1999 | すべてのモードで1月8日になります。 |
| 08-Jan-1999 | すべてのモードで1月8日になります。 |
| 99-Jan-08 | YMDモードで1月8日、他のモードではエラー。 |
| 08-Jan-99 | 1月8日。ただしYMDモードではエラー。 |
| Jan-08-99 | 1月8日。ただしYMDモードではエラー。 |
| 19990108 | ISO 8601。すべてのモードで1999年1月8日になります。 |
| 990108 | ISO 8601。すべてのモードで1999年1月8日になります。 |
| 1999.008 | 年と年間通算日 |
| J2451187 | ユリウス日 |
| January 8, 99 BC | 西暦紀元前99年 |
ある一日の時刻を表す型はtime [(とp) ] without time zonetime [ (です。
p) ] with time zonetime単独ではtime without time zoneと同じです。
これらの型への有効な入力は、時刻、その後にオプションで時間帯からなります。
(表 8.11と表 8.12を参照してください。)
time without time zoneへの入力に時間帯が指定された場合、時間帯は警告なく無視されます。
また、日付を指定することもできますが、America/New_Yorkのような夏時間規則を含む時間帯名を使用しているのでなければ、それは無視されます。
夏時間規則のある時間帯名の場合は、標準と夏時間のどちらを適用するかを決定できるように、日付の指定が必要です。
適切な時間帯オフセットはtime with time zone型の値に記録され格納された通りに出力されます。アクティブなタイムゾーンに調整されることはありません。
表8.11 時刻入力
| 例 | 説明 |
|---|---|
04:05:06.789 | ISO 8601 |
04:05:06 | ISO 8601 |
04:05 | ISO 8601 |
040506 | ISO 8601 |
04:05 AM | 04:05と同じ。AMは値に影響を与えない。 |
04:05 PM | 16:05と同じ。時の入力は12以下でなければなりません。 |
04:05:06.789-8 | ISO 8601, UTC オフセットとしてのタイムゾーン |
04:05:06-08:00 | ISO 8601, UTC オフセットとしてのタイムゾーン |
04:05-08:00 | ISO 8601, UTC オフセットとしてのタイムゾーン |
040506-08 | ISO 8601, UTC オフセットとしてのタイムゾーン |
040506+0730 | ISO 8601, UTC オフセットとしての小数付き時間のタイムゾーン |
040506+07:30:00 | 秒まで指定されたUTCオフセット(ISO 8601では未サポート) |
04:05:06 PST | 省略形による時間帯の指定。 |
2003-04-12 04:05:06 America/New_York | 名前による時間帯の指定。 |
表8.12 時間帯入力
| 例 | 説明 |
|---|---|
PST | 省略形(米国太平洋標準時間) |
America/New_York | 完全な時間帯名 |
PST8PDT | POSIX書式の時間帯指定 |
-8:00:00 | PSTのUTCオフセット |
-8:00 | PSTのUTCオフセット(ISO 8601の拡張フォーマット) |
-800 | PSTのUTCオフセット(ISO 8601の基本フォーマット) |
-8 | PSTのUTCオフセット(ISO 8601の基本フォーマット) |
zulu | UTC用の軍事用略記 |
z | zuluの略記(また、ISO 8601) |
時間帯の指定方法に関する詳細は8.5.3を参照してください。
タイムスタンプ型への有効な入力は、日付と時刻を連結し、さらにその後にオプションで時間帯、その後にオプションでADもしくはBCからなります。
(他にAD/BCを時間帯の前に付ける方法もありますが、これは推奨される順序ではありません。)
したがって、
1999-01-08 04:05:06
と
1999-01-08 04:05:06 -8:00
は有効な値で、ISO 8601に準拠しています。 また、広く使用されている
January 8 04:05:06 1999 PST
という書式もサポートされます。
標準SQLでは、timestamp without time zoneのリテラルとtimestamp with time zoneのリテラルを、時刻の後の「+」もしくは「-」記号と時間帯補正の有無により区別します。
そのため、標準に従うと、
TIMESTAMP '2004-10-19 10:23:54'
はtimestamp without time zoneに、
TIMESTAMP '2004-10-19 10:23:54+02'
はtimestamp with time zoneになります。
PostgreSQLでは、その型を決める前に文字列リテラルの内容を検証しません。
そのため上の例はいずれもtimestamp without time zoneとして扱います。
リテラルが確実にtimestamp with time zoneとして扱われるようにするには、例えば、以下のように正しい明示的な型を指定してください。
TIMESTAMP WITH TIME ZONE '2004-10-19 10:23:54+02'
timestamp without time zoneと決定済みの値では、PostgreSQLは警告なく時間帯情報をすべて無視します。
つまり、結果の値は明示された入力文字列の日付/時刻フィールドから持ち込まれますが、時間帯の調整はなされません。
timestamp with time zone値の場合、明示的な時間帯を含む入力された文字列は、その時間帯の適切なオフセットを使用してUTC(協定世界時)に変換されます。
入力文字列に時間帯が指定されていない場合は、システムのTimeZoneパラメータに示されている値が時間帯とみなされ、timezone時間帯用のオフセットを使用してUTCに変換されます。
どちらのケースでも、値は内部的にUTCとして格納され、最初に指定または想定された時間帯は保持されません。
timestamp with time zoneの値が出力されると、この値はUTCから現行のtimezoneに変換され、その時間帯のローカル時間として表示されます。
他の時間帯での時間を表示するには、timezoneを変更するか、あるいはAT TIME ZONE構文(9.9.4 を参照)を使用します。
timestamp without time zoneとtimestamp with time zoneの間の変換では、通常timestamp without time zoneの値はtimezoneのローカル時間としてみなされる、または、指定されるものと想定されます。
AT TIME ZONEを使用する変換では、異なる時間帯を指定できます。
PostgreSQLでは利便性のために、表 8.13に示されているような特別な日付/時刻入力値をサポートしています。
infinityと-infinityの値は、特別にシステム内部で表現され、変更されずに表示されます。
他のものは、単に簡略化された表記で、読み込まれるときに通常の日付/時刻値に変換されます。
(特にnowとその関連文字列は読み込まれるとすぐにその時点の値に変換されます。)
これらの値はすべて、SQLコマンドで定数として使う場合は、単一引用符でくくらなければなりません。
表8.13 特別な日付/時刻定数
| 入力文字列 | 有効な型 | 説明 |
|---|---|---|
epoch | date, timestamp | 1970-01-01 00:00:00+00(Unixシステム時間におけるゼロ) |
infinity | date, timestamp, interval | 他のすべてのタイムスタンプより将来 |
-infinity | date, timestamp, interval | 他のすべてのタイムスタンプより過去 |
now | date, time, timestamp | 現トランザクションの開始時刻 |
today | date, timestamp | 今日の午前0時(00:00) |
tomorrow | date, timestamp | 明日の午前0時(00:00) |
yesterday | date, timestamp | 昨日の午前0時(00:00) |
allballs | time | 00:00:00.00 UTC |
SQL互換の関数である、CURRENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMP、LOCALTIME、LOCALTIMESTAMPも、対応するデータ型の現在の日付または時間の値を取得するために使用できます。
(9.9.5 を参照してください。)
これらはSQL関数であり、データ入力文字列として認識されないことに注意してください。
入力する文字列としてnow、today、tomorrow及びyesterdayはインタラクティブなSQLコマンドの中で利用する時は良いですが、コマンドが保存され後に実行されるような時には驚く挙動になることがあります。例えば、準備された文、ビューや関数の定義です。
文字列は特定の時間の値に変換され、その値が古くなってからもしばらく使い続けられることがあります。
このような状況では、代わりにSQL関数を使用してください。
例えば、'tomorrow'::dateよりもCURRENT_DATE + 1の方が安全です。
日付/時刻型の出力書式は、ISO 8601、SQL(Ingres)、伝統的なPOSTGRES(Unix date書式)またはGermanの4つのいずれかに設定できます。
デフォルトはISO書式です。
(標準SQLではISO 8601書式の使用が定められています。
「SQL」という出力書式名は歴史的な事故です。)
表 8.14に各出力書式の例を示します。
dateとtimeの書式は、例にあるとおり、それぞれ日付と時刻の部分です。しかし、POSTGRESではISO書式の日付部分のみを出力します。(YMDやMDYの場合12-17-1997を返し、DMYの場合17-12-1997を返します。)
表8.14 日付/時刻の出力形式
| 様式指定 | 説明 | 例 |
|---|---|---|
ISO | ISO 8601, 標準SQL | 1997-12-17 07:37:16-08 |
SQL | 伝統的な様式 | 12/17/1997 07:37:16.00 PST |
Postgres | 独自の様式 | Wed Dec 17 07:37:16 1997 PST |
German | 地域限定様式 | 17.12.1997 07:37:16.00 PST |
ISO 8601の仕様では日付と時刻を区切るために大文字のTを使用します。
PostgreSQLは入力ではこの書式を受け付けますが、上記のように出力ではTではなく空白を使用します。
これは読みやすさのため、そしてRFC3339や他のデータベースシステムとの整合性を保つためです。
SQLとPOSTGRESでは、DMYフィールド順が指定された場合は月の前に日が現れます。 指定がなければ日の前に月が現れます。 (この設定が入力値の解釈にどう影響を与えるのかについては8.5.1を参考にしてください)。 表 8.15に例を示します。
表8.15 日付の順序の慣習
datestyleの設定 | 入力の順序 | 出力例 |
|---|---|---|
SQL, DMY | day(日)/month(月)/year(年) | 17/12/1997 15:37:16.00 CET |
SQL, MDY | month(月)/day(日)/year(年) | 12/17/1997 07:37:16.00 PST |
Postgres, DMY | day(日)/month(月)/year(年) | Wed 17 Dec 07:37:16 1997 PST |
ISO形式ではタイムゾーンはUTCからの符号付きの数値で表現され、グリニッジより東の地域では正の符号が使用されます。
オフセットは時間の整数倍であればhh(時間のみ)、分の整数倍であればhh:mm、それ以外の場合は、hh:mm:ssで表現されます。
(三番目のケースは現代のどのタイムゾーンの標準でもありえませんが、タイムゾーンが標準化される前に適用されたタイムスタンプで動いている場合に現れる可能性があります。)
他の日付スタイルでは、現在の地域で一般的に使われている場合、タイムゾーンは省略形で表現されます。
それ以外の場合はISO 8601の基本フォーマット(hhやhhmm)の符号付き数値のオフセットとして表示されます。
ユーザはSET DATESTYLEコマンド、postgresql.conf構成ファイルのDateStyleパラメータ、そしてサーバかクライアントのPGDATESTYLE環境変数を使用して、日付/時刻の様式を選択することができます。
日付/時刻出力のより柔軟な書式設定方法として、書式設定関数to_char(9.8を参照)を使用することもできます。
時間帯および時間帯の取り決めは地球の幾何学的要素のみでなく政治的決定に影響されます。 世界にまたがる時間帯は1900年代に標準化されたようですが、特に夏時間規則の点で、勝手に変更する傾向が続いています。 PostgreSQLは歴史的な時間帯ルールについての情報に、広く使われているIANA時間帯データベースを使用します。 将来の時間は、ある与えられた時間帯に対する最新の既知のルールが、将来長きに渡りそのまま遵守が継続されるということを前提としています。
PostgreSQLは典型的な使用法については標準SQLへの互換性に対し最大限の努力をしています。 しかし、標準SQLには、日付と時刻のデータ型と機能に関する混乱が見受けられます。 2つの明らかな問題点を以下に示します。
date型にはそれに関連する時間帯を持てませんが、time型にはあります。
現実の世界において、時間帯のオフセットが夏時間への切り替えにより年間を通じて変化することから、時刻と同様に日付もそれに結び付けられていないと意味がありません。
デフォルトの時間帯はUTCからの整数定数オフセットとして指定されています。 したがってDST(夏時間)への切り替えをまたいで日付/時刻演算を行う場合、夏時間を適用することは不可能です。
このような問題を解決するためには、時間帯を使用する際に日付と時刻の両方を保持できる日付/時刻データ型を使用することを勧めます。
time with time zone型の使用はお勧めしません
(もっともPostgreSQLでは、旧式のアプリケーションや、標準SQLとの互換性のために、time with time zone型の使用をサポートしています)。
PostgreSQLは、日付または時刻のみを保持するデータ型のすべては使用中の時間帯であると前提しています。
すべての時間帯付きの日付と時刻はUTCで内部的に保存されます。 これらはクライアントに表示される前にTimeZone設定パラメータで指定された時間帯におけるローカル時間に変換されます。
PostgreSQLでは、3つの形式で時間帯を指定することができます。
America/New_Yorkなどの完全な時間帯名称。
認識できる時間帯名称はpg_timezone_namesビューに列挙されています(52.32を参照してください)。
PostgreSQLはこの目的のためによく使用されているIANA時間帯データを使用します。
したがって、他のソフトウェアでも同じ名前が認識されます。
PSTなどの時間帯省略形。
こうした指定は、単に特定のUTCからのオフセットを定義します。
一方、完全な時間帯名称では夏時間遷移規則群も組み込まれます。
認識可能な省略形はpg_timezone_abbrevsビューに列挙されています(52.31を参照してください)。
TimeZone設定パラメータおよびlog_timezone設定パラメータを時間帯省略形に設定することはできませんが、日付時刻型の入力値やAT TIME ZONE演算子に省略形を使用することができます。
時間帯名やその省略形に加え、PostgreSQLは、B.5に記載されているPOSIX様式の時間帯指定を受付けます。 このオプションは通常、名前付きのタイムゾーンを使用するよりも好ましくありませんが、適切なIANAタイムゾーンのエントリが利用できない場合は必要になるかもしれません。
一言で言うと、これは省略形と正式名称との差異です。
省略形はUTCから固定したオフセットを表わすのに対して、多くの正式名称はローカルの夏時間規定を暗示するので、2つのUTCオフセットがあるかもしれません。
例えば2014-06-04 12:00 America/New_Yorkはニューヨークの正午を示しますが、これはこの日について言えば東部夏時間(UTC-4)です。
つまり2014-06-04 12:00 EDTはこれと同時刻を示します。
しかし、2014-06-04 12:00 ESTは、その日に夏時間が使用されていたかどうかに関わらず、東部標準時間(UTC-5)での正午を示します。
問題を更に複雑にしているのは、一部の管轄は同じ略号を使って、年によって異なるUTCオフセットを表していることです。
例えばモスクワではMSKはある年ではUTC+3を意味しますが、別の年ではUTC+4を意味します。
PostgreSQLではそのような略号について、指定の日に何を意味していたか(あるいは最も最近にどういう意味だったか)に従って解釈します。
しかし、ESTの例にあるように、必ずしもその日付における地方常用時を示しているとは限りません。
すべての場合において、時間帯名や略号は大文字小文字の区別なく認識されます。 (これはPostgreSQLの8.2より前のバージョンからの変更です。 以前は、文脈によって大文字小文字が区別される場合と、されない場合がありました。)
時間帯名、省略形のどちらもサーバ内に組み込まれるわけではありません。
インストールディレクトリの.../share/timezone/および.../share/timezonesets/の下に保存される構成ファイルから取得されます(B.4を参照ください)。
TimeZoneはpostgresql.confファイルや第19章で説明する他の標準的な方法で設定することができます。
以下に、いくつか特別な設定方法を示します。
SQLコマンドSET TIME ZONEはセッションの時間帯を設定します。
これはSET TIMEZONE TOの別名ですが、SQL仕様の構文へのより高い互換性があります。
PGTZ環境変数は、libpqクライアントが接続時にサーバにSET TIME ZONEコマンドを送信するために用いられます。
interval値は以下の冗長な構文を使って記述されます。
[@]quantityunit[quantityunit...] [direction]
ここで、quantityは(符号付き)時間量、unit(単位)はmicrosecond、millisecond、second(秒)、minute(分)、hour(時)、day(日)、week(週)、month(月)、year(年)、decade(10年単位)、century(100年単位)、millennium(1000年単位)あるいはこれらの単位の簡略形または複数形です。
direction(方向)はagoもしくは空です。
アットマーク(@)はオプションで、付けても付けなくても構いません。
異なる単位における時間量は適切に符号を考慮して暗黙的に足されます。
agoはすべてのフィールドの正負を逆にします。
この構文はまた、IntervalStyleがpostgres_verboseに設定されている場合に時間間隔の出力でも使用されます。
日、時、分、および秒の時間量は明示的に単位を指定しなくても構いません。
例えば、'1 12:59:10'は'1 day 12 hours 59 min 10 sec'(1日と12時間59分10秒)と解釈されます。
また年と月の組み合わせはダッシュを使って指定することができます。
例えば、'200-10'は'200 years 10 months'(200年と10か月)と解釈されます。
(実際のところ、標準SQLで許されている簡略形はこれらだけです。
そしてIntervalStyleがsql_standardに設定されている場合には、これらが出力で使用されます。)
標準の4.4.3.2節の「指定文字付書式」または4.4.3.3節の「代替書式」のどちらかを使用して、時間間隔値はISO 8601時間間隔として書くこともできます。 指定文字付の書式は以下のようなものです。
Pquantityunit[quantityunit...] [ T [quantityunit...]]
文字列はPで始まらなければならず、また、日と時間を区切るTを含めることができます。
利用可能な単位の省略形を表 8.16に示します。
単位は省略しても構いませんし、任意の順番で指定できますが、1日より小さな単位はTの後に書かなければなりません。
特にMの意味はTの前にあるか後にあるかに依存します。
表8.16 ISO 8601における時間間隔単位の省略形
| 省略形 | 意味 |
|---|---|
| Y | 年 |
| M | 月(日付部分における) |
| W | 週 |
| D | 日 |
| H | 時間 |
| M | 分(時刻部分における) |
| S | 秒 |
別の書式を示します。
P [years-months-days] [ Thours:minutes:seconds]
上の代替書式では、文字列はPから始まらなければなりません。
そして、Tは時間間隔の日付部分と時刻部分とを分割します。
値はISO 8601日付と同様の数字で指定されます。
fields指定を使って時間間隔定数を記述する場合、または、fields仕様で定義された時間間隔列に文字列を割り当てる場合、マークされていない時間量の解釈はfieldsに依存します。
例えばINTERVAL '1' YEARは1年と解釈され、一方でINTERVAL '1'は1秒と解釈されます。
同時に、fields仕様によって許可される最下位フィールドの「右側の」フィールド値は警告なしに破棄されます。
例えば、INTERVAL '1 day 2:03:04' HOUR TO MINUTEと書くことで、二番目のフィールドは削除されますが、日付フィールドは削除されません。
標準SQLに従うと、時間間隔値のフィールドはすべて同じ符号を持たなければなりません。
このため、先頭の負の符号はすべてのフィールドに適用されます。
例えば時間間隔リテラル'-1 2:03:04'の負の符号は、日付部分にも時、分、秒部分にも適用されます。
PostgreSQLではフィールドに異なる符号を持たせることができます。
また伝統的にテキスト形式表現における各フィールドは独立した符号を持つものとして扱われます。
このため、この例では時、分、秒部分は正であるとみなされます。
IntervalStyleがsql_standardに設定されている場合、先頭の符号はすべてのフィールドに適用されるものとみなされます(ただし他に符号がない場合のみです)。
さもなくば、伝統的なPostgreSQLの解釈が使用されます。
あいまいさを防ぐために、負のフィールドがある場合には個別に明示的な符号を付けることを勧めます。
内部的には、interval値は3つの整数フィールドとして格納されます。
月、日、マイクロ秒です。
月の日数は変化したり、 夏時間の移行が含まれる場合は1日が23時間または25時間になったりするため、これらのフィールドは分けて保持されます。
他の単位を使用する時間間隔の入力文字列は、このフォーマットに正規化され、出力用に標準化された方法で再再構成されます。例えば以下のとおりです。
SELECT '2 years 15 months 100 weeks 99 hours 123456789 milliseconds'::interval;
interval
---------------------------------------
3 years 3 mons 700 days 133:17:36.789
ここでは、週は「7日」と理解され、別々に保持されていますが、小さな時間単位と大きな時間単位は結合され、正規化されています。
入力フィールドの値には小数部分が含まれる場合があります。例えば、'1.5 weeks'や'01:02:03.45'などです。
しかし、intervalは内部的に整数フィールドでのみ格納されるため、小数の位はより小さな単位に変換する必要があります。
月より大きな小数部分の位は月の整数に丸められます。例えば、'1.5 years'は'1 year 6 mons'になります。
週と日の小数部分は、1ヶ月は30日、1日は24時間と想定して整数の日数やマイクロ秒として計算されます。例えば'1.75 months'は1 mon 22 days 12:00:00になります。
出力では秒だけが小数として表示されます。
表 8.17は有効なinterval入力のいくつかの例を示しています。
表8.17 時間間隔入力
| 例 | 説明 |
|---|---|
1-2 | 標準SQL書式。1年2ヶ月 |
3 4:05:06 | 標準SQL書式。3日4時間5分6秒 |
1 year 2 months 3 days 4 hours 5 minutes 6 seconds | 伝統的Postgres書式。1年2月3日4時間5分6秒 |
P1Y2M3DT4H5M6S | ISO 8601 「指定文字付き書式」。意味は上と同じ |
P0001-02-03T04:05:06 | ISO 8601 「代替書式」。意味は上と同じ |
前述のように、PostgreSQLはinterval値を月、日、マイクロ秒として格納します。
出力の場合、monthsフィールドは12で除算して年と月に変換されます。
daysフィールドはそのまま表示されます。
microseconds フィールドは、時間、分、秒、および小数の秒に変換されます。
したがって、月、分、秒はそれぞれ0~11、0~59、0~59の範囲を超えることはありませんが、表示される年、日、時間のフィールドは非常に大きくなる可能性があります。
(大きな日数または時間の値を次に高いフィールドに移すことが望ましい場合は、justify_daysおよびjustify_hours関数を使用できます)。
時間間隔型の出力書式は、SET intervalstyleコマンドを使用して、sql_standard、postgres、postgres_verboseまたはiso_8601の4つのうちの1つを設定できます。
デフォルトはpostgres書式です。
表 8.18はそれぞれの出力形式を示した例です。
sql_standard形式は、時間間隔値が標準制約(構成要素に正負が混在していない年数と月数のみ、または日数と時間のみ)を満足する場合、時間間隔リテラル文字列に対し標準SQLに準拠している出力を作成します。
それ以外の場合、出力は、標準的な年数-月数のリテラル文字列の後に日数-時間のリテラル文字列が続いたものになり、正負混在した時間間隔のあいまいさを無くすために明示的な符号が付加されます。
postgres書式の出力は、DateStyleパラメータがISOに設定されたとき、PostgreSQL 8.4より前のリリースと一致します。
postgres_verbose書式の出力は、DateStyleパラメータがISO以外に設定されたとき、PostgreSQL 8.4より前のリリースと一致します。
iso_8601書式の出力はISO 8601 標準の4.4.3.2節に記述の「format with designators(指名付き書式)」に一致します。
表8.18 時間間隔出力形式の例
| 形式指定 | 年-月時間間隔 | 日-時刻時間間隔 | 混在した時間間隔 |
|---|---|---|---|
sql_standard | 1-2 | 3 4:05:06 | -1-2 +3 -4:05:06 |
postgres | 1 year 2 mons | 3 days 04:05:06 | -1 year -2 mons +3 days -04:05:06 |
postgres_verbose | @ 1 year 2 mons | @ 3 days 4 hours 5 mins 6 secs | @ 1 year 2 mons -3 days 4 hours 5 mins 6 secs ago |
iso_8601 | P1Y2M | P3DT4H5M6S | P-1Y-2M3DT-4H-5M-6S |