Table 4-14ではdate/time値で使用できる 関数が書かれています。基本算術演算子(+、 *など)も使用することができます。 フォーマット関数に関してはSection 4.6を 参照して下さい。また、date/time型に関してはSection 3.4を参照して下さい。
Table 4-14. Date/Time 関数
名前 | 返り値 | 説明 | 例 | 結果 |
---|---|---|---|---|
current_date | date | 現在の日付を返す。 下記を参照。 | ||
current_time | time | 現在の時刻を返す。 下記を参照。 | ||
current_timestamp | timestamp | 現在の日付と時間を返す。 下記を参照。 | ||
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) | 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関数は、date/time値から年や時間などの サブフィールドを抽出します。sourceとは timestamp型やinterval型に評価する値式です。 (date型、またはtime型の表現は timestamp型にキャストされるのでこれらも使用できます。) fieldは識別子(文字列ではありません。)で、 source値(source value)からどのフィールドを抽出するかを選択します。 extract関数の返り値は double precisionです。 下記は有効な値です。
100で割り切れる年
SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40'); 結果: 20
実際に、入力された日付の世紀ではないことに注意して下さい。
月の日付(1 - 31)
SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40'); 結果: 16
10で割り切れる年
SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40'); 結果: 200
曜日(0 - 6; 0が日曜日)(timestamp型のみで使用可)
SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40'); 結果; 5
年の通算日数(1 - 365/366)(timestamp型のみ使用可)
SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40'); 結果: 47
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
時(0 - 23)
SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40'); 結果: 20
分数部分も含めた、1000000をかけた秒を返す。秒すべてを返すことに 注意して下さい。
SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5'); 結果: 28500000
1000で割り切れる年
SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40'); 結果: 2
実際に、入力された日付の千年期ではないことに注意して下さい。
分数部分も含めた、1000をかけた秒を返す。秒すべてを返すことに 注意して下さい。
SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5'); 結果: 28500
時(0 - 59)
SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40'); 結果: 38
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
指定された日付がある四半期(1 - 4)(timestamp型のみ使用可)
SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40'); 結果: 1
分数部分も含めた、秒を返す(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
timestamp型の値により、その日付の年通算の週を 計算します。ISO 8601では、その年の 1月4日がある週を第1週とします。ISOでは、 週は月曜日から始まるとしています。つまり、年の最初の木曜日が ある週がその年の第1週となります。
SELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40'); 結果: 7
年を返す
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
date_trunc関数は、数のtrunc 関数と概念的には似ているものです。
date_trunc('field', source)sourceはtimestamp型( 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
下記の関数は現在の日付、または時間を取得するための関数です。
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つのフォームは呼び出し関数なので、 ディフォルト値が使用されるまで評価されません。 したがって、これらの関数は、列の値の挿入時に 要求通りのディフォルト設定を行います。
[1] | オペレーティングシステムでうるう秒が 実装されている場合は60になります。 |