Table 4-17 は日付/時刻の値の処理を行う関数を示しています。 Table 4-16 は(+、* 等のような)基本的な算術演算子の振舞いを説明しています。フォーマッティング関数については Section 4.7 を参照ください。日付/時刻データ型に付いての背景となっている情報に精通していなければなりません( Section 3.5 を参照)。
以下に示す日付/時刻演算子の振舞いは時間帯付きおよび無しのデータ型に似通っています。
Table 4-16. 日付/時刻演算子
名前 | 例 | 結果 |
---|---|---|
+ | timestamp '2001-09-28 01:00' + interval '23 hours' | timestamp '2001-09-29 00:00' |
+ | date '2001-09-28' + interval '1 hour' | timestamp '2001-09-28 01:00' |
+ | time '01:00' + interval '3 hours' | time '04:00' |
- | timestamp '2001-09-28 23:00' - interval '23 hours' | timestamp '2001-09-28' |
- | date '2001-09-28' - interval '1 hour' | timestamp '2001-09-27 23:00' |
- | time '05:00' - interval '2 hours' | time '03:00' |
- | interval '2 hours' - time '05:00' | time '03:00:00' |
* | interval '1 hour' * int '3' | interval '03:00' |
/ | interval '1 hour' / int '3' | interval '00:20' |
日付/時刻関数は以下にまとめてあります。引き続く節で追加的な詳しい情報があります。
Table 4-17. 日付/時刻関数
名前 | 返り値型 | 説明 | 例 | 結果 |
---|---|---|---|---|
age(timestamp) | interval | 今日の日付からの減算 | age(timestamp '1957-06-13') | 43 年 8 ヵ月 3 日 |
age(timestamp, timestamp) | interval | 引数から減算 | age('2001-04-10', timestamp '1957-06-13') | 43 年 9 ヵ月 27 日< |
current_date | date | 本日の日付 下記 を参照。 | ||
current_time | time | 本日の時刻 下記 を参照。 | ||
current_timestamp | timestamp | 日付と時刻 下記 を参照。 | ||
date_part(text, timestamp) | 倍精度 | 部分フィールドの取得 ( extract と同じ):下記 も参照。 | date_part('hour', timestamp '2001-02-16 20:38:40') | 20 |
date_part(text, interval) | 倍精度 | 部分フィールドの取得 (extract と同じ): 下記 も参照。 | date_part('month', interval '2 years 3 months') | 3 |
date_trunc(text, timestamp) | timestamp | 指定された精度で切捨て: 下記 も参照。 | date_trunc('hour', timestamp '2001-02-16 20:38:40') | 2001-02-16 20:00:00+00 |
extract(field from timestamp) | 倍精度 | 部分フィールドの取得:下記 も参照。 | extract(hour from timestamp '2001-02-16 20:38:40') | 20 |
extract(field from interval) | 倍精度 | 部分フィールドの取得:下記 も参照。 | extract(month from interval '2 years 3 months') | 3 |
isfinite(timestamp) | 論理値 | 有限 timestamp のテスト (無効もしくは無限大) | isfinite(timestamp '2001-02-16 21:28:30') | true |
isfinite(interval) | 論理値 | 有限 interval のテスト | isfinite(interval '4 hours') | true |
now() | timestamp | 現在の日付と時刻 (current_timestamp と同じ):下記 を参照。 | ||
timeofday() | text | 現在の日付と時刻: 下記 を参照。 | timeofday() | Wed Feb 21 17:01:13.000126 2001 EST |
timestamp(date) | timestamp | date から timestamp へ | timestamp(date '2000-12-25') | 2000-12-25 00:00:00 |
timestamp(date, time) | timestamp | date と time から timestampへ | timestamp(date '1998-02-24',time '23:07') | 1998-02-24 23:07:00 |
EXTRACT (field FROM source)
extract 関数は日付/時刻の値から年とか時刻などの部分フィールドを抽出します。source は timestamp または interval を評価する評価式です。( date 型または time 型の評価式は timestamp 型にキャストされますので同様に使用可能です。) field は source の値からどのフィールドを抽出するかを選択する識別子もしくは文字列です。extract 関数は倍精度型の値を返します。以下は有効な値です。
年フィールドを 100 で割ったもの
(月内の)日付フィールド (1 - 31)
年フィールドを 10 で割ったもの
曜日(0〜6、日曜日が 0、timestamp の値のみで使用可)
年内での通算日数(1〜365/366)(timestamp の値のみ使用可)
date 型と timestamp 型の値において、1970-01-01 00:00:00 からの秒数(負の数の場合もあり): interval の値ではその時間間隔における秒の合計
時のフィールド (0 - 23)
端数部分も含め、1,000,000 を乗じた秒フィールド。秒すべてを返すことに注意
年フィールドを 1000 で割ったもの
millennium フィールドは年フィールドを単に 1000 で割算したもので、1900 年代の年をを第 2 ミレニアムとする従来の定義とは異なります。
端数部分も含み、1000 を乗じられた秒フィールド。すべての秒を含むことに注意
分フィールド (0 - 59)
timestamp の値に対する年内の月番号 (1 - 12): interval の値に対しては月番号で、12 の剰余 (0 - 11)
その日が含まれる年の四半期 (1 - 4) (timestamp の値に対してのみ)
端数を含んだ秒フィールド (0 - 59) で[1]。
時間帯オフセットの時の成分
時間帯オフセットの分の成分
timestamp 型の値に対し、その日がある年完通算での週を計算します。ISO 8601 の定義では、その年の 1 月 4 日の週を第 1 週とします。(ISO では、週は月曜日から始まるとしています。)つまり、年の最初の木曜日がある週がその年の第 1 週となります。
年フィールド
extract 関数はもともと計算処理の目的でした。日付/時刻の値を表示する目的でのフォーマティングに付いては Section 4.7 を参照してください。
date_part 関数は SQL-関数 extract と因習的な Ingres が互換をとるためのモデル化です。
date_part('field', source)
ここで field の値は文字列でなければならないことに注意してください。有効な date_part の値は extract と同じです。
date_trunc 関数は概念的に数値に対する trunc 関数と類似しています。
date_trunc('field', source)
source はデータ型 timestamp の評価式です(データ型 date と time は自動的にキャストされます)。field は timestamp の値をどの精度で切捨てるかを選択します。返り値の値は選択されたものより小さいすべてのフィールドがゼロ(日と月の場合は 1)に設定されます。
field の有効値には次のものがあります。
microseconds (マイクロ秒) |
milliseconds (ミリ秒) |
second (秒) |
minute (分) |
hour (時) |
day (日) |
month (月) |
year (年) |
decade (十年) |
century (世紀) |
millennium (ミレニアム) |
以下の関数は、現在の日付または時間を取得するための関数です。
CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_TIME ( precision ) CURRENT_TIMESTAMP ( precision )
CURRENT_TIME と CURRENT_TIMESTAMP 関数は精度のパラメータをオプションで与えることができ、数多くの端数桁を丸める結果をもたらします。
Note: PostgreSQL 7.2 以前では精度パラメータは実装されておりませんでした。そして結果は常に整数による秒となりました。
Note: SQL99 標準規格によるとこれらの関数は、精度パラメータが与えられていない限り丸括弧を付けないで記述されなければなりません。 PostgreSQL 7.2 時点では中身の記述の無い丸括弧を記述しても構いませんが、効果が無く将来のリリースでは削除される予定です。
SELECT CURRENT_TIME; 14:39:53.662522-05 SELECT CURRENT_DATE; 2001-12-23 SELECT CURRENT_TIMESTAMP; 2001-12-23 14:39:53.662522-05 SELECT CURRENT_TIMESTAMP(2); 2001-12-23 14:39:53.66-05
now() 関数は CURRENT_TIMESTAMP 互換の PostgreSQL に於ける因習です。
同時に timeofday() 関数があって、歴史的理由により timestamp の値ではなくテキスト文字列を返します。
CURRENT_TIMESTAMP と、それに関連する関数はすべて現在のトランザクションが開始された時間を返すことを認識してください。とても重要なことです。この値はトランザクションが実行されている間に増加しません。とは言っても、timeofday() は実際の現在時間を返します。
すべての日付/時刻データ型は同時に now という現在の日付と時刻を特定する特殊なリテラル値を受け付けます。したがって、下記の 3 つの実行結果はすべて同じものとなります。
SELECT CURRENT_TIMESTAMP; SELECT now(); SELECT TIMESTAMP 'now';
Note: テーブルを作成する時、デフォルト値を設定するのに 3 番目の形式を使おうとは思わないでしょう。定数が解釈された時、システムが now を timestamp に変換するので、デフォルト値が必要な場合はテーブルが作成された時刻が使われます。最初の 2 つの形式はデフォルト値が使用されるまで評価されません。ですから、これらの関数は列の挿入時にデフォルトに叶った振舞いをします。
[1] | オペレーティングシステムでうるう秒が実装されている場合は 60 まで |