他のバージョンの文書9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

4.8. 日付/時刻関数と演算子

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_datedate本日の日付 下記 を参照。  
current_timetime本日の時刻 下記 を参照。  
current_timestamptimestamp日付と時刻 下記 を参照。  
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)timestampdate から timestamptimestamp(date '2000-12-25')2000-12-25 00:00:00
timestamp(date, time)timestampdatetime から timestamptimestamp(date '1998-02-24',time '23:07')1998-02-24 23:07:00

4.8.1. EXTRACT, date_part

EXTRACT (field FROM source)

extract 関数は日付/時刻の値から年とか時刻などの部分フィールドを抽出します。sourcetimestamp または interval を評価する評価式です。( date 型または time 型の評価式は timestamp 型にキャストされますので同様に使用可能です。) field は source の値からどのフィールドを抽出するかを選択する識別子もしくは文字列です。extract 関数は倍精度型の値を返します。以下は有効な値です。

century (世紀)

年フィールドを 100 で割ったもの

SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 20

day (日)

(月内の)日付フィールド (1 - 31)

SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 16

decade (十年)

年フィールドを 10 で割ったもの

SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 200

dow (曜日)

曜日(0〜6、日曜日が 0、timestamp の値のみで使用可)

SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 5

doy (通算日数)

年内での通算日数(1〜365/366)(timestamp の値のみ使用可)

SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 47

epoch

date 型と timestamp 型の値において、1970-01-01 00:00:00 からの秒数(負の数の場合もあり): interval の値ではその時間間隔における秒の合計

SELECT EXTRACT(EPOCH FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 982352320

SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours');
Result: 442800

hour (時)

時のフィールド (0 - 23)

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 20

microseconds (マイクロ秒)

端数部分も含め、1,000,000 を乗じた秒フィールド。秒すべてを返すことに注意

SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5');
Result: 28500000

millennium (ミレニアム)

年フィールドを 1000 で割ったもの

SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 2

millennium フィールドは年フィールドを単に 1000 で割算したもので、1900 年代の年をを第 2 ミレニアムとする従来の定義とは異なります。

milliseconds (ミリ秒)

端数部分も含み、1000 を乗じられた秒フィールド。すべての秒を含むことに注意

SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5');
Result: 28500

minute (分)

分フィールド (0 - 59)

SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 38

month (月)

timestamp の値に対する年内の月番号 (1 - 12): interval の値に対しては月番号で、12 の剰余 (0 - 11)

SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 2

SELECT EXTRACT(MONTH FROM INTERVAL '2 years 3 months');
Result: 3

SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months');
Result: 1

quarter (四半期)

その日が含まれる年の四半期 (1 - 4) (timestamp の値に対してのみ)

SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 1

second (秒)

端数を含んだ秒フィールド (0 - 59) で[1]

SELECT EXTRACT(SECOND FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 40

SELECT EXTRACT(SECOND FROM TIME '17:12:28.5');
Result: 28.5

timezone_hour

時間帯オフセットの時の成分

timezone_minute

時間帯オフセットの分の成分

week (週)

timestamp 型の値に対し、その日がある年完通算での週を計算します。ISO 8601 の定義では、その年の 1 月 4 日の週を第 1 週とします。(ISO では、週は月曜日から始まるとしています。)つまり、年の最初の木曜日がある週がその年の第 1 週となります。

SELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 7

year (年)

年フィールド

SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 2001

extract 関数はもともと計算処理の目的でした。日付/時刻の値を表示する目的でのフォーマティングに付いては Section 4.7 を参照してください。

date_part 関数は SQL-関数 extract と因習的な Ingres が互換をとるためのモデル化です。

date_part('field', source)

ここで field の値は文字列でなければならないことに注意してください。有効な date_part の値は extract と同じです。

SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');
Result: 16

SELECT date_part('hour', INTERVAL '4 hours 3 minutes');
Result: 4

4.8.2. date_trunc

date_trunc 関数は概念的に数値に対する trunc 関数と類似しています。

date_trunc('field', source)

source はデータ型 timestamp の評価式です(データ型 datetime は自動的にキャストされます)。field は timestamp の値をどの精度で切捨てるかを選択します。返り値の値は選択されたものより小さいすべてのフィールドがゼロ(日と月の場合は 1)に設定されます。

field の有効値には次のものがあります。

microseconds (マイクロ秒)
milliseconds (ミリ秒)
second (秒)
minute (分)
hour (時)
day (日)
month (月)
year (年)
decade (十年)
century (世紀)
millennium (ミレニアム)

SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');
Result: 2001-02-16 20:00:00+00

SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40');
結果: 2001-01-01 00:00:00+00

4.8.3. 現在の日付/時刻

以下の関数は、現在の日付または時間を取得するための関数です。


CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TIME ( precision )
CURRENT_TIMESTAMP ( precision )

CURRENT_TIMECURRENT_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 の値ではなくテキスト文字列を返します。

SELECT timeofday();
 Sat Feb 17 19:07:32.000126 2001 EST

CURRENT_TIMESTAMP と、それに関連する関数はすべて現在のトランザクションが開始された時間を返すことを認識してください。とても重要なことです。この値はトランザクションが実行されている間に増加しません。とは言っても、timeofday() は実際の現在時間を返します。

すべての日付/時刻データ型は同時に now という現在の日付と時刻を特定する特殊なリテラル値を受け付けます。したがって、下記の 3 つの実行結果はすべて同じものとなります。

SELECT CURRENT_TIMESTAMP;
SELECT now();
SELECT TIMESTAMP 'now';

Note: テーブルを作成する時、デフォルト値を設定するのに 3 番目の形式を使おうとは思わないでしょう。定数が解釈された時、システムが nowtimestamp に変換するので、デフォルト値が必要な場合はテーブルが作成された時刻が使われます。最初の 2 つの形式はデフォルト値が使用されるまで評価されません。ですから、これらの関数は列の挿入時にデフォルトに叶った振舞いをします。

Notes

[1]

オペレーティングシステムでうるう秒が実装されている場合は 60 まで