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

Table 6-18 は、日付/時刻型の値の処理で使用可能な関数を示しています。詳細は、以下の副節で表しています。 Table 6-17 は、(+* 等の) 基本的な算術演算子の振舞いを説明しています。フォーマッティング関数については Section 6.7 を参照ください。日付/時刻データ型に付いての背景となっている情報に精通していなければなりません ( Section 5.5 を参照)。

以下で記述されている、時刻またはタイムスタンプ入力を受け取る関数および演算子はすべて、実際には 2 つの変数を取ります。 ひとつは時間帯付きの時刻またはタイムスタンプで、もう 1 つは時間帯無しの時刻またはタイムスタンプです。 省略のため、これらの変数は個別に表示されません。

Table 6-17. 日付/時刻演算子

名前結果
+ 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: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:00'
- time '05:00' - interval '2 hours'time '03:00: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:00'

Table 6-18. 日付/時刻関数

名前返り値型説明結果
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本日の日付、Section 6.8.4 を参照。   
current_timetime with time zone本日の時刻、Section 6.8.4 を参照。   
current_timestamptimestamp with time zone日付と時刻、Section 6.8.4 を参照。   
date_part(text, timestamp)double precision (倍精度)部分フィールドの取得 (extract と同じ): 下記 も参照。 date_part('hour', timestamp '2001-02-16 20:38:40')20
date_part(text, interval)double precision (倍精度)部分フィールドの取得 (extract と同じ): 下記 も参照。 date_part('month', interval '2 years 3 months')3
date_trunc(text, timestamp)timestamp指定された精度で切捨て: Section 6.8.2 も参照。 date_trunc('hour', timestamp '2001-02-16 20:38:40')2001-02-16 20:00:00+00
extract(field from timestamp)double precision (倍精度)部分フィールドの取得:Section 6.8.1 も参照。 extract(hour from timestamp '2001-02-16 20:38:40')20
extract(field from interval)double precision (倍精度)部分フィールドの取得:Section 6.8.1 も参照。 extract(month from interval '2 years 3 months')3
isfinite(timestamp)boolean (論理値)有限 timestamp のテスト (無効もしくは無限大)isfinite(timestamp '2001-02-16 21:28:30')true
isfinite(interval)boolean (論理値)有限 interval のテストisfinite(interval '4 hours')true
localtimetime本日の時刻、Section 6.8.4 を参照。   
localtimestamptimestamp日付と時刻、Section 6.8.4 を参照。   
now()timestamp with time zone現在の日付と時刻 (current_timestamp と同じ): Section 6.8.4 を参照。   
timeofday()text (テキスト)現在の日付と時刻、Section 6.8.4 を参照。 timeofday()Wed Feb 21 17:01:13.000126 2001 EST

6.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');
結果: 20

century フィールドは、年フィールドを単に 100 で除算したもので、1900 年代のほとんどの年を 20 世紀とする従来の定義とは異なります。

day (日)

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

SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40');
結果: 16
decade (十年)

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

SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40');
結果: 200
dow (曜日)

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

SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');
結果: 5
doy (通算日数)

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

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

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

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

SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours');
結果: 442800
hour (時)

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

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
結果: 20
microseconds (マイクロ秒)

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

SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5');
結果: 28500000
millennium (ミレニアム)

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

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

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

milliseconds (ミリ秒)

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

SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5');
結果: 28500
minute (分)

分フィールド (0 - 59)

SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40');
結果: 38
month (月)

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

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

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

SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months');
結果: 1
quarter (四半期)

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

SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40');
結果: 1
second (秒)

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

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

SELECT EXTRACT(SECOND FROM TIME '17:12:28.5');
結果: 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');
結果: 7
year (年)

年フィールド

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

extract 関数はもともと計算処理の目的でした。日付/時刻の値を表示する目的でのフォーマティングに付いては Section 6.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');
結果: 16

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

6.8.2. date_trunc

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

date_trunc('field', source)

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

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

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

例:

SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');
結果: 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

6.8.3. AT TIME ZONE

AT TIME ZONE 構文を使用することにより、タイムスタンプを異なる時間帯に変換することができます。

Table 6-19. AT TIME ZONE 変数

返り値説明
timestamp without time zone AT TIME ZONE zone timestamp with time zone与えられた時間帯のローカル時間を UTC に変換します。
timestamp with time zone AT TIME ZONE zone timestamp without time zoneUTC を与えられた時間帯のローカル時間に変換します。
time with time zone AT TIME ZONE zone time with time zone時間帯に関係なくローカル時間を変換します。

上記の式では、設定する時間の zone は、('PST' のような) テキスト文字列、または (INTERVAL '-08:00' のような) 時間間隔で指定することができます。

以下に例を示します (TimeZonePST8PDT に設定しています)。

SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'MST';
結果: 2001-02-16 19:38:40-08

SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST';
結果: 2001-02-16 18:38:40

最初の例では、時間帯に関係のないタイムスタンプが使用され、それが MST 時間 (GMT-7) として解釈され、UTC タイムスタンプを生成します。それから、UTC タイムスタンプが、表示上 PST (GMT-8) に置き換えられます。 2 番目の例では、EST (GMT-5) に指定されたタイムスタンプが使用され、それが MST (GMT-7) でのローカル時間に変換されています。

関数 timezone(zone, timestamp) は、SQL 準拠の構文 timestamp AT TIME ZONE zone と同じ機能を果たします。

6.8.4. 現在の日付/時刻

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

CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TIME ( precision )
CURRENT_TIMESTAMP ( precision )
LOCALTIME
LOCALTIMESTAMP
LOCALTIME ( precision )
LOCALTIMESTAMP ( precision )

CURRENT_TIME および CURRENT_TIMESTAMP 関数では、時間帯を伴う値を扱います。一方、LOCALTIME および LOCALTIMESTAMP では、時間帯を伴わない値を扱います。

CURRENT_TIMECURRENT_TIMESTAMPLOCALTIME、および LOCALTIMESTAMP 関数では、精度のパラメータをオプションで与えることができ、それに合わせて端数桁を丸める結果をもたらします。 精度のパラメータがない場合、結果は使用可能な最大精度で出力されます。

Note: 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

SELECT LOCALTIMESTAMP;
2001-12-23 14:39:53.662522

now() 関数は CURRENT_TIMESTAMP 互換の PostgreSQL に於ける因習です。

同時に timeofday() 関数があって、歴史的理由により timestamp の値ではなくテキスト文字列を返します。

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

CURRENT_TIMESTAMP と、それに関連する関数は、すべて現在のトランザクションが開始された時間を返すことを理解してください。この値は、トランザクションが実行されている間は変化しません。 timeofday() は、壁時計時刻を返し、トランザクションが実行されている間にも増加します。

Note: 他の多くのデータベースシステムでは、これらの値をより頻繁に増加させます。

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

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

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

Notes

[1]

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