Skip to content

날짜/시간 함수

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])

포맷 문자열

포맷 표현식설명
YYYY연도 4자리
YY연도 2자리
MM월 2자리 (01~12)
MON월 3자리 영문 약어 (JAN, FEB, …)
DD일 2자리
DAY요일 3자리 영문 약어 (SUN, MON, …)
IWISO 8601 주차 (1~53, 월요일 기준)
WW연간 주차 (1~53, 요일 무관)
W월간 주차 (1~5, 요일 무관)
HH시간 2자리
HH12시간 12시간제 (1~12)
HH24시간 24시간제 (0~23)
HH2, HH3, HH6지정 단위로 시간 절사
MI분 2자리
MI2, MI5, MI10, MI20, MI30지정 단위로 분 절사
SS초 2자리
SS2, SS5, SS10, SS20, SS30지정 단위로 초 절사
AMAM/PM
mmm밀리초 3자리 (0~999)
uuu마이크로초 3자리 (0~999)
nnn나노초 3자리 (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는 UTC 기준 1970-01-01 00:00:00부터 경과한 나노초 정수를 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;
최근 업데이트