日付・時刻

パラメータ

ここでは、DATESTYLEとTIMEZONEという2つのパラメータを扱う。
パラメータとはセッション中(ログインしている間)で使用できる変数のようなもの。
パラメータの設定はSET、表示はSHOWを使用する。

SET パラメータ名 TO 値;
SHOW パラメータ名;

SHOW ALLとすると全てのパラメータを表示できる。

日付・時刻に関連する型

内容
DATE日付
TIME[ WITHOUT TIME ZONE]時刻(タイムゾーンなし)
TIME WITH TIME ZONE時刻(タイムゾーンあり)
TIMESTAMP[ WITHOUT TIME ZONE]日時(タイムゾーンなし)
TIMESTAMP WITH TIME ZONE日時(タイムゾーンあり)

タイムゾーンとは協定世界時からどのくらいの差があるかを示す値である。
国や地域ごとに決まっている。

DATESTYLEパラメータ

DATESTYLEは日付の入力と出力の形式を制御するパラメータ。
カンマ(,)の前が出力、後ろが入力の形式を制御する。
ここでは、主に入力形式を確認する。

oddtbs=> show datestyle;
 ISO, YMD
※ YMDとは入力形式があいまいな場合、年月日の順で解釈することを意味する。

oddtbs=> select '09-10-14'::date;
 2009-10-14
※ 2009年10月14日と解釈された。

oddtbs=> set datestyle to iso, mdy;
SET
※ 入力形式をMDYに変更。

oddtbs=> select '09-10-14'::date;
 2014-09-10
※ 2014年9月10日と解釈された。

oddtbs=> select '2009-10-13'::date;
 2009-10-13
※ 曖昧さがない場合はその通りに解釈する。

oddtbs=> set datestyle to default;
SET
※ DATESTYLEを元に戻した。

oddtbs=> show datestyle;
 ISO, YMD

CURRENT_DATE関数

現在(今日)の日付を取得する。

oddtbs=> select current_date;
 2009-08-11

TIME( WITHOUT TIME ZONE)型とTIME WITH TIME ZONE型

oddtbs=> select '16:30:20'::time;
 16:30:20

oddtbs=> select '16:30:20'::time with time zone;
 16:30:20+09
+09がタイムゾーンであり協定世界時より9時間進んでいることを意味する。

TIMEZONEパラメータ

TIMEZONEはタイムゾーンを制御するパラメータ。

oddtbs=> show timezone;
 Asia/Tokyo
東京のタイムゾーンになっている。

oddtbs=> set timezone to 'US/Hawaii';
SET
ハワイのタイムゾーンに設定した。

oddtbs=> select '16:30:20'::time with time zone;
 16:30:20-10
-10がタイムゾーンであり協定世界時より10時間遅れていることを意味する。

oddtbs=> set timezone to default;
SET
タイムゾーンを元に戻した。

oddtbs=> show timezone;
 Asia/Tokyo

CURRENT_TIME関数

現在時刻を取得する。

oddtbs=> select current_time;
 21:41:01.921+09

oddtbs=> set timezone to 'US/Hawaii';
SET

oddtbs=> select current_time;
 02:41:46.64-10

oddtbs=> set timezone to default;
SET

oddtbs=> show timezone;
 Asia/Tokyo

TIMESTAMP( WITHOUT TIME ZONE)型とTIMESTAMP WITH TIME ZONE型

oddtbs=> select '2009-10-13 16:30:20'::timestamp;
 2009-10-13 16:30:20

oddtbs=> select '2009-10-13 16:30:20'::timestamp with time zone;
 2009-10-13 16:30:20+09

CURRENT_TIMESTAMP関数

現在日時を取得する。

oddtbs=> select current_timestamp;
 2009-08-11 21:49:15.953+09

oddtbs=> set timezone to 'US/Hawaii';
SET

oddtbs=> select current_timestamp;
 2009-08-11 02:49:48.015-10

oddtbs=> set timezone to default;
SET

oddtbs=> show timezone;
 Asia/Tokyo

日付・時刻の比較

日付・時刻・日時の比較に関しては、過去が小、未来が大と解釈して判断する。

oddtbs=> select '2009-10-13'::date > '2008-6-20'::date;
 t

oddtbs=> select '2009-10-13 9:20:18'::timestamp > '2008-5-20 20:9:18'::timestamp;
 t

oddtbs=> select '2009-10-13 9:20:18'::time > '2008-5-20 20:9:18'::time;
 f
※ TIMEでキャストすると日付が抜け落ちるので注意

日付・時刻の演算

日付 - 日付 = 整数
日付 +- 整数 = 日付
日時 - 日時 = 時間差
日時 += 時間差 = 日時

※ 時間差は具体的にはINTERVALという型

oddtbs=> select '2009-10-13'::date - '2008-6-20'::date;
      480

oddtbs=> select '2009-10-13'::date - 480;
 2008-06-20

oddtbs=> select '2009-10-13 9:20:18'::timestamp - '2008-6-20 20:9:18'::timestamp;
 479 days 13:11:00
※ これがINTERVAL型

oddtbs=> select '2009-10-13 9:20:18'::timestamp - '479 days 13:11:00'::interval;
 2008-06-20 20:09:18

oddtbs=> select age('2009-10-13 9:20:18'::timestamp, '2008-6-20 20:9:18'::timestamp);
 1 year 3 mons 22 days 13:11:00
※ AGE関数は基本的に引き算と同じだが、結果が年月日の形式となる。

EXTRACT関数

日付・時刻・日時の一部の数値を取得する。

EXTRACT(フィールド名 FROM 日付・時刻・日時)
フィールド名意味
year
month
day
dow曜日(日曜が0)
hour
minute
second
oddtbs=> select extract(year from '2009-10-13 9:20:18'::timestamp);
      2009

oddtbs=> select extract(minute from '2009-10-13 9:20:18'::timestamp);
        20

oddtbs=> select extract(month from '1 year 3 mons 22 days'::interval);
         3

oddtbs=> select extract(year from age(current_timestamp, '1976-10-13'::timestamp));
        32