4.7. Date/Time 関数

Table 4-14ではdate/time値で使用できる 関数が書かれています。基本算術演算子(+*など)も使用することができます。 フォーマット関数に関してはSection 4.6を 参照して下さい。また、date/time型に関してはSection 3.4を参照して下さい。

Table 4-14. Date/Time 関数

名前返り値説明結果
current_datedate 現在の日付を返す。 下記を参照。   
current_timetime 現在の時刻を返す。 下記を参照。   
current_timestamptimestamp 現在の日付と時間を返す。 下記を参照。   
date_part(text, timestamp)double precision date/time値からサブフィールドを取り出す。 (extract関数と同義。下記も参照。) date_part('hour', timestamp '2001-02-16 20:38:40')20
date_part(text, interval)double precision interval値からサブフィールドを取り出す。( extractと同義。 下記も参照。) date_part('month', interval '2 years 3 months')3
date_trunc(text, timestamp)timestamp dateを指定されたに精密度に切り捨てる。 date_trunc('hour', timestamp '2001-02-16 20:38:40')2001-02-16 20:00:00+00
extract(timestampからの識別子)double precision date/time値からサブフィールドを取り出す。(下記も参照) extract(hour from timestamp '2001-02-16 20:38:40')20
extract(intervalからの識別子)double precision interval 値からサブフィールドを取り出す。(下記も参照) 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
now()timestamp 現在の日付と時間を返す。(current_timestamp と同義。下記も参照)   
timeofday()text 日付と時間の高精密度を返す。下記参照。 timeofday()Wed Feb 21 17:01:13.000126 2001 EST
timestamp(date)timestampdateをtimestampに変換timestamp(date '2000-12-25')2000-12-25 00:00:00
timestamp(date, time)timestampdateとtimeを結合させて timestampにするtimestamp(date '1998-02-24',time '23:07')1998-02-24 23:07:00

4.7.1. EXTRACT, date_part

EXTRACT (field FROM source)

extract関数は、date/time値から年や時間などの サブフィールドを抽出します。sourceとは timestamp型やinterval型に評価する値式です。 (date型、またはtime型の表現は timestamp型にキャストされるのでこれらも使用できます。) fieldは識別子(文字列ではありません。)で、 source値(source value)からどのフィールドを抽出するかを選択します。 extract関数の返り値は double precisionです。 下記は有効な値です。

century(世紀)

100で割り切れる年

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

実際に、入力された日付の世紀ではないことに注意して下さい。

day(日付)

月の日付(1 - 31)

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

decade(10年)

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(マイクロセカンド)

分数部分も含めた、1000000をかけた秒を返す。秒すべてを返すことに 注意して下さい。

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

millennium(千年期)

1000で割り切れる年

SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40');
結果: 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型 では月の数(0 - 11;モジュロ 12)を返す

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

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 4.6をご覧下さい。

date_part関数は、Postgres 伝来のもので、SQL関数のextractと 同義です。

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

4.7.2. date_trunc

date_trunc関数は、数のtrunc 関数と概念的には似ているものです。

date_trunc('field', source)
sourcetimestamp型( date型とtime型は自動的にキャストされます)の 値式です。fieldはtimestampの値を どの精度で切り落とすかを選択します。返り値はtimestamp型 の選択された、0以上に設定されたもの(月日の場合は1)すべてのフィールド です。

有効なfieldの値は下記の通りです。

microseconds(マイクロセカンド)
milliseconds(ミリセカンド)
second(秒)
minute(分)
hour(時)
day(日)
month(月)
year(年)
decade(10年)
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

4.7.3. 現在の 日付/時間

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

CURRENT_TIME
CURRENT_DATE
CURRENT_TIMESTAMP
標準SQLの条件として、これらの関数は 括弧をつけて実行しないことに注意して下さい。

SELECT CURRENT_TIME;
19:07:32

SELECT CURRENT_DATE;
2001-02-17

SELECT CURRENT_TIMESTAMP;
2001-02-17 19:07:32-05

now()関数はPostgres 伝来のものです。CURRENT_TIMESTAMPと同義です。

timeofday()関数は、現在の時間を CURRENT_TIMESTAMP関数群よりも高い精度で返します。

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

timeofday()関数は、オペレーティングシステムの呼び出し、 gettimeofday(2)を使用し、プラットフォームに よりますが、マイクロセカンドまでの結果を取り出すことができます。 その他の関数はtime(2)に依存し、秒単位の 結果を返します。歴史的背景により、timeofday() 関数はtimestamp型の値ではなく、文字列で結果を返します。

CURRENT_TIMESTAMPと、その他の関連する関数すべては、 現在のトランザクションが開始された時間を返すことに注意して下さい。 また、それらの値はトランザクションが実行されている間に増加しません。 しかし、timeofday()は実際の現在時間を返します。

すべての日付/時間データ型はnowという、現在の日付と時間を 特定する、特殊な定数を認識します。したがって、下記のプログラムの 実行結果はすべて同じものとなります。

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

Note: テーブルを作成する時に、ディフォルト値を特定する際には 3つ目のフォームを指定しないで下さい。定数が解釈された時に システムがnowをtimestampに変換するので、もし ディフォルト値が必要な場合はテーブルが作成された時刻が 使われます。最初の2つのフォームは呼び出し関数なので、 ディフォルト値が使用されるまで評価されません。 したがって、これらの関数は、列の値の挿入時に 要求通りのディフォルト設定を行います。

Notes

[1]

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