コンテンツにスキップ

日付/時刻関数

MachbaseのDATETIME型は、1970-01-01 00:00:00 UTCからの経過時間をナノ秒値で内部保存します。日付/時刻関数は、この値を読みやすい形式へ変換したり、算術演算を行ったりします。

クイックリファレンス

関数構文説明
SYSDATE / NOWSYSDATE, NOW現在のシステム時刻を返す
TO_DATETO_DATE(str [, fmt])文字列をDATETIMEへ変換
TO_DATE_SAFETO_DATE_SAFE(str [, fmt])変換失敗時にNULLを返す
TO_CHARTO_CHAR(col [, fmt])DATETIMEを文字列へ変換
ADD_TIMEADD_TIME(col, diff)日付/時刻の加減算
DATE_TRUNCDATE_TRUNC(unit, col [, count])指定単位で時刻を切り捨て
DATE_BINDATE_BIN(unit, count, col [, origin])指定した基準で時刻をバケット化
DAYOFWEEKDAYOFWEEK(col)曜日番号を返す(0=日曜日)
YEAR / MONTH / DAYYEAR(col), MONTH(col), DAY(col)年、月、日を抽出
FROM_UNIXTIMEFROM_UNIXTIME(unix_ts)Unixタイムスタンプ(32ビット)をDATETIMEへ変換
UNIX_TIMESTAMPUNIX_TIMESTAMP(col)DATETIMEをUnixタイムスタンプ(32ビット)へ変換
FROM_TIMESTAMPFROM_TIMESTAMP(ns)ナノ秒整数をDATETIMEへ変換
TO_TIMESTAMPTO_TIMESTAMP(col)DATETIMEをナノ秒整数へ変換

SYSDATE / NOW

現在のシステム時刻を返す疑似列です。SYSDATENOWは同じ値を返します。

SYSDATE
NOW
Mach> SELECT SYSDATE, NOW FROM t1;
SYSDATE                         NOW
-------------------------------------------------------------------
2017-01-16 14:14:53 310:973:000 2017-01-16 14:14:53 310:973:000

TO_DATE

指定した書式文字列に従って文字列をDATETIME型へ変換します。書式を省略すると、デフォルトのYYYY-MM-DD HH24:MI:SS mmm:uuu:nnnを使用します。

TO_DATE(date_string [, format_string])
Mach> SELECT TO_DATE('2014-12-30 11:22:33 444:555:666');
2014-12-30 11:22:33 444:555:666

Mach> SELECT TO_DATE('1999-12-31 13:12:32', 'YYYY-MM-DD HH24:MI:SS');
1999-12-31 13:12:32 000:000:000

Mach> SELECT TO_DATE('1999', 'YYYY');
1999-01-01 00:00:00 000:000:000

変換失敗時にエラーではなくNULLを返すTO_DATE_SAFE()も提供します。

Mach> SELECT TO_DATE_SAFE('2016-12-32', 'YYYY-MM-DD');
NULL

TO_CHAR (DATETIME)

DATETIME列の値を指定形式の文字列へ変換します。書式を省略すると、デフォルトのYYYY-MM-DD HH24:MI:SS mmm:uuu:nnnを使用します。

TO_CHAR(datetime_col [, format_string])

書式文字列

書式指定子説明
YYYY4桁の年
YY2桁の年
MM2桁の月(01~12
MON月の英語3文字略称(JAN, FEB, …)
DD2桁の日
DAY曜日の英語3文字略称(SUN, MON, …)
IWISO 8601の週番号(1~53、月曜日基準)
WW年内の週番号(1~53、曜日に依存しない)
W月内の週番号(1~5、曜日に依存しない)
HH2桁の時
HH1212時間制の時(1~12
HH2424時間制の時(0~23
HH2, HH3, HH6指定単位で時刻を切り捨て
MI2桁の分
MI2, MI5, MI10, MI20, MI30指定単位で分を切り捨て
SS2桁の秒
SS2, SS5, SS10, SS20, SS30指定単位で秒を切り捨て
AMAM/PM
mmm3桁のミリ秒(0~999
uuu3桁のマイクロ秒(0~999
nnn3桁のナノ秒(0~999
Mach> SELECT TO_CHAR(dt, 'YYYY-MM-DD HH24:MI:SS') FROM datetime_table;
2014-12-30 11:22:33
2013-11-11 01:02:03

Mach> SELECT TO_CHAR(dt, 'YYYY-MM-DD HH24:MI:SS mmm.uuu.nnn') FROM datetime_table;
2014-12-30 11:22:33 444.555.666

ADD_TIME

DATETIME列に年/月/日/時/分/秒単位の加減算を行います。ミリ秒・マイクロ秒・ナノ秒単位はサポートしません。

ADD_TIME(column, time_diff_format)

time_diff_format形式: "Year/Month/Day Hour:Minute:Second"(各項目は正数または負数)

-- 1年後
Mach> SELECT ADD_TIME(dt, '1/0/0 0:0:0') FROM t;

-- 1時間1分1秒後
Mach> SELECT ADD_TIME(dt, '0/0/0 1:1:1') FROM t;

-- 1年1か月1日前
Mach> SELECT ADD_TIME(dt, '-1/-1/-1 0:0:0') FROM t;

DATE_TRUNC

DATETIME値を指定時間単位に切り捨てて返します。countを指定すると、その倍数単位で切り捨てます。

DATE_TRUNC(field, date_val [, count])

対応する時間単位と最大範囲

時間単位最大範囲
nanosecond (nsec)1,000,000,000 (1秒)
microsecond (usec)60,000,000 (60秒)
millisecond (msec)60,000 (60秒)
second (sec)86,400 (1日)
minute (min)1,440 (1日)
hour24 (1日)
day1
week1 (日曜日開始)
month1
year1
-- 秒単位で切り捨て
Mach> SELECT COUNT(*), DATE_TRUNC('second', i2) tm FROM t GROUP BY tm ORDER BY 2;

-- 2秒単位で切り捨て
Mach> SELECT COUNT(*), DATE_TRUNC('second', i2, 2) tm FROM t GROUP BY tm ORDER BY 2;

-- 2分単位で切り捨て(DATE_TRUNC('second', time, 120)と同じ)
Mach> SELECT COUNT(*), DATE_TRUNC('minute', ts, 2) tm FROM t GROUP BY tm;

DATE_BIN

基準時刻originを基点に、DATETIME値を指定した時間単位と幅のバケットへ割り当てます。originを省略すると、ローカルタイムゾーンの1970-01-01 00:00:00を使用します。

DATE_BIN(field, count, source [, origin])
-- 2時間バケット(指定したorigin基準)
SELECT DATE_BIN('hour', 2, time, TO_DATE('2020-01-01 00:00:00')) FROM log ORDER BY time;

-- 3時間バケット(ローカルタイムゾーンの境界基準)
SELECT DATE_BIN('hour', 3, ts) FROM t ORDER BY ts;

DAYOFWEEK

DATETIME値の曜日を整数で返します。

DAYOFWEEK(date_val)
戻り値曜日
0日曜日
1月曜日
2火曜日
3水曜日
4木曜日
5金曜日
6土曜日
SELECT DAYOFWEEK(dt) FROM log_table;

YEAR / MONTH / DAY

入力DATETIME値から年、月、日を抽出して整数で返します。

YEAR(datetime_col)
MONTH(datetime_col)
DAY(datetime_col)
Mach> SELECT YEAR(c1), MONTH(c1), DAY(c1) FROM extract_table;
year(c1)    month(c1)   day(c1)
---------------------------------
2001        1           1

FROM_UNIXTIME / UNIX_TIMESTAMP

FROM_UNIXTIMEは32ビットのUnixタイムスタンプ整数をDATETIMEへ変換します。UNIX_TIMESTAMPは逆にDATETIMEを32ビットのUnixタイムスタンプへ変換します。

FROM_UNIXTIME(unix_timestamp_value)
UNIX_TIMESTAMP(datetime_value)
Mach> SELECT FROM_UNIXTIME(315540671);
1980-01-01 11:11:11 000:000:000

Mach> INSERT INTO unix_table VALUES (UNIX_TIMESTAMP('2001-01-01'));
Mach> SELECT * FROM unix_table;
C1
-----------
978274800

FROM_TIMESTAMP / TO_TIMESTAMP

FROM_TIMESTAMPは1970-01-01 00:00:00 UTCからの経過ナノ秒数を表す整数をDATETIMEへ変換します。 TO_TIMESTAMPは逆にDATETIMEを同じ基準時点からの経過ナノ秒数の整数へ変換します。

基準時点はUTC+09:00では1970-01-01 09:00:00と表示されます。 次の例の日付と時刻はUTC+09:00基準です。

FROM_TIMESTAMP(nanosecond_time_value)
TO_TIMESTAMP(datetime_value)
Mach> SELECT FROM_TIMESTAMP(1562302560007248869);
2019-07-05 13:56:00 007:248:869

Mach> SELECT TO_TIMESTAMP(c1) FROM datetime_tbl;
to_timestamp(c1)
-----------------------
1262308210000000000

ナノ秒単位の算術演算例:

-- 現在時刻の1ms(1,000,000 ns)前
SELECT FROM_TIMESTAMP(SYSDATE - 1000000) FROM t;
最終更新日