날짜와 시간 함수 및 연산자

날짜와 시간 함수 및 연산자 (Date and time functions and operators)

이 문서는 Trino의 날짜와 시간 함수 및 연산자를 설명합니다. 날짜/시간 연산, 시간대 변환, 포맷/파싱, 간격 처리 등 다양한 기능을 배울 수 있어요.

출처: 문서

본문

이 함수와 연산자는 날짜와 시간 데이터 유형에 대해 동작합니다.

날짜와 시간 연산자 (Date and time operators)

연산자 예제 결과
+ date '2012-08-08' + interval '2' day 2012-08-10
+ time '01:00' + interval '3' hour 04:00:00.000
+ timestamp '2012-08-08 01:00' + interval '29' hour 2012-08-09 06:00:00.000
+ timestamp '2012-10-31 01:00' + interval '1' month 2012-11-30 01:00:00.000
+ interval '2' day + interval '3' hour 2 03:00:00.000
+ interval '3' year + interval '5' month 3-5
- date '2012-08-08' - interval '2' day 2012-08-06
- time '01:00' - interval '3' hour 22:00:00.000
- timestamp '2012-08-08 01:00' - interval '29' hour 2012-08-06 20:00:00.000
- timestamp '2012-10-31 01:00' - interval '1' month 2012-09-30 01:00:00.000
- interval '2' day - interval '3' hour 1 21:00:00.000
- interval '3' year - interval '5' month 2-7

시간대 변환 (Time zone conversion)

AT TIME ZONE 연산자는 타임스탬프의 시간대를 설정합니다:

SELECT timestamp '2012-10-31 01:00 UTC';
-- 2012-10-31 01:00:00.000 UTC

SELECT timestamp '2012-10-31 01:00 UTC' AT TIME ZONE 'America/Los_Angeles';
-- 2012-10-30 18:00:00.000 America/Los_Angeles

AT LOCAL 연산자는 현재 세션 시간대에서 datetime을 렌더링합니다:

SELECT timestamp '2012-10-31 01:00 UTC' AT LOCAL;
-- 2012-10-30 18:00:00.000 America/Los_Angeles  (session zone)

OVERLAPS

OVERLAPS 조건은 두 기간이 시점을 공유하는지 검사합니다. 각 피연산자는 두 요소의 행 값입니다:

  • 첫 번째 요소는 기간의 시작점인 datetime 값.
  • 두 번째 요소는 기간의 끝점(datetime 값) 또는 기간의 길이(interval 값. 이 경우 끝은 start + interval로 계산).
SELECT (DATE '2020-01-01', DATE '2020-06-01') OVERLAPS (DATE '2020-05-01', DATE '2020-12-31');
-- true

SELECT (DATE '2020-01-01', DATE '2020-03-01') OVERLAPS (DATE '2020-05-01', DATE '2020-07-01');
-- false

SELECT (DATE '2020-01-01', INTERVAL '5' MONTH) OVERLAPS (DATE '2020-05-01', INTERVAL '7' MONTH);
-- true

피연산자의 시작과 끝이 역순으로 주어지면 평가 전에 정규화됩니다. 반개방(hal-of-open) 의미는 경계에서만 접하는 기간(한 기간의 끝이 다른 기간의 시작과 같음)은 겹치지 않는다는 것을 의미합니다. 다만 시작점이 같은 두 기간은 항상 겹칩니다.

한 기간의 끝점이 NULL이면 그 기간은 해당 쪽이 열린 것으로 취급됩니다. 알려진 끝점이 비교를 고정하므로, 알려진 끝점이 다른 기간 안에 들어갈 때마다 결과는 true이고, 열린 쪽이 결과를 결정하지 못할 때만 NULL(unknown)입니다.

날짜와 시간 함수 (Date and time functions)

current_date

쿼리 시작 시점의 현재 날짜를 반환합니다.

current_time

쿼리 시작 시점의 현재 시간(시간대 포함)을 반환합니다.

current_timestamp

쿼리 시작 시점의 현재 타임스탬프(시간대 포함)를 3자리 이하 초 정밀도로 반환합니다.

current_timestamp(p)

쿼리 시작 시점의 현재 타임스탬프(시간대 포함)를 p자리 이하 초 정밀도로 반환합니다:

SELECT current_timestamp(6);
-- 2020-06-24 08:25:31.759993 America/Los_Angeles

current_timezone() → varchar

IANA가 정의한 형식(예: America/Los_Angeles) 또는 UTC로부터의 고정 오프셋(예: +08:35)으로 현재 시간대를 반환합니다.

date(x) → date

CAST(x AS date)의 별칭입니다.

last_day_of_month(x) → date

월의 마지막 날을 반환합니다. x의 유형은 date, timestamp, timestamp with time zone일 수 있습니다.

from_iso8601_timestamp(string) → timestamp(3) with time zone

ISO 8601 형식의 날짜 string(선택적으로 시간과 시간대 포함)을 timestamp(3) with time zone으로 파싱합니다. 시간은 00:00:00.000, 시간대는 세션 시간대로 기본 설정됩니다:

SELECT from_iso8601_timestamp('2020-05-11');
-- 2020-05-11 00:00:00.000 America/Vancouver

SELECT from_iso8601_timestamp('2020-05-11T11:15:05');
-- 2020-05-11 11:15:05.000 America/Vancouver

SELECT from_iso8601_timestamp('2020-05-11T11:15:05.055+01:00');
-- 2020-05-11 11:15:05.055 +01:00

from_iso8601_timestamp_nanos(string) → timestamp(9) with time zone

ISO 8601 형식의 날짜와 시간 string을 파싱합니다. 시간대는 세션 시간대로 기본 설정됩니다:

SELECT from_iso8601_timestamp_nanos('2020-05-11T11:15:05');
-- 2020-05-11 11:15:05.000000000 America/Vancouver

SELECT from_iso8601_timestamp_nanos('2020-05-11T11:15:05.123456789+01:00');
-- 2020-05-11 11:15:05.123456789 +01:00

from_iso8601_date(string) → date

ISO 8601 형식의 날짜 stringdate로 파싱합니다. 날짜는 역법 날짜, ISO 주 번호를 사용한 주 날짜, 또는 연도와 연중 일수가 결합된 형태일 수 있습니다:

SELECT from_iso8601_date('2020-05-11');
-- 2020-05-11

SELECT from_iso8601_date('2020-W10');
-- 2020-03-02

SELECT from_iso8601_date('2020-123');
-- 2020-05-02

at_timezone(x, zone) → timestamp(p) with time zone

xzone에 지정된 시간대로 변환합니다. x의 유형은 time with time zone 또는 timestamp with time zone일 수 있습니다.

다음 예제에서 입력 시간대는 GMT인데, 2022년 11월에 America/Los_Angeles보다 7시간 앞섭니다:

SELECT at_timezone(TIMESTAMP '2022-11-01 09:08:07.321 GMT', 'America/Los_Angeles')
-- 2022-11-01 02:08:07.321 America/Los_Angeles

with_timezone(timestamp(p), zone) → timestamp(p) with time zone

timestamp에 지정된 시간대 zone을 가진 정밀도 p의 타임스탬프를 반환합니다:

SELECT current_timezone()
-- America/New_York

SELECT with_timezone(TIMESTAMP '2022-11-01 09:08:07.321', 'America/Los_Angeles')
-- 2022-11-01 09:08:07.321 America/Los_Angeles

from_unixtime(unixtime) → timestamp(3) with time zone

UNIX 타임스탬프 unixtime을 시간대가 있는 타임스탬프로 반환합니다. unixtime1970-01-01 00:00:00 UTC 이후의 초 수입니다.

from_unixtime(unixtime, zone) → timestamp(3) with time zone

zone을 시간대로 사용해 UNIX 타임스탬프 unixtime을 시간대가 있는 타임스탬프로 반환합니다.

from_unixtime(unixtime, hours, minutes) → timestamp(3) with time zone

hoursminutes를 시간대 오프셋으로 사용해 UNIX 타임스탬프 unixtime을 시간대가 있는 타임스탬프로 반환합니다. unixtimedouble 데이터 유형의 1970-01-01 00:00:00 이후 초 수입니다.

from_unixtime_nanos(unixtime) → timestamp(9) with time zone

UNIX 타임스탬프 unixtime을 시간대가 있는 타임스탬프로 반환합니다. unixtime1970-01-01 00:00:00.000000000 UTC 이후의 나노초 수입니다:

SELECT from_unixtime_nanos(100);
-- 1970-01-01 00:00:00.000000100 UTC

SELECT from_unixtime_nanos(DECIMAL '1234');
-- 1970-01-01 00:00:00.000001234 UTC

SELECT from_unixtime_nanos(DECIMAL '1234.499');
-- 1970-01-01 00:00:00.000001234 UTC

SELECT from_unixtime_nanos(DECIMAL '-1234');
-- 1969-12-31 23:59:59.999998766 UTC

localtime

쿼리 시작 시점의 현재 시간을 반환합니다.

localtimestamp

쿼리 시작 시점의 현재 타임스탬프를 3자리 이하 초 정밀도로 반환합니다.

localtimestamp(p)

쿼리 시작 시점의 현재 타임스탬프를 p자리 이하 초 정밀도로 반환합니다:

SELECT localtimestamp(6);
-- 2020-06-10 15:55:23.383628

now() → timestamp(3) with time zone

current_timestamp의 별칭입니다.

to_iso8601(x) → varchar

x를 ISO 8601 문자열로 포맷합니다. x의 유형은 date, time, time with timezone, timestamp, timestamp with time zone일 수 있습니다.

to_milliseconds(interval) → bigint

일-초 interval을 밀리초로 반환합니다.

to_unixtime(timestamp) → double

timestamp를 UNIX 타임스탬프로 반환합니다.

다음 SQL 표준 함수는 괄호를 사용하지 않습니다: current_date, current_time, current_timestamp, localtime, localtimestamp.

절삭 함수 (Truncation function)

date_trunc 함수는 다음 단위를 지원합니다:

단위 절삭된 값 예제
millisecond 2001-08-22 03:04:05.321
second 2001-08-22 03:04:05.000
minute 2001-08-22 03:04:00.000
hour 2001-08-22 03:00:00.000
day 2001-08-22 00:00:00.000
week 2001-08-20 00:00:00.000
month 2001-08-01 00:00:00.000
quarter 2001-07-01 00:00:00.000
year 2001-01-01 00:00:00.000

위 예제들은 입력 타임스탬프 2001-08-22 03:04:05.321을 사용합니다.

date_trunc(unit, x) → [입력과 동일]

xunit으로 절삭한 값을 반환합니다:

SELECT date_trunc('day' , TIMESTAMP '2022-10-20 05:10:00');
-- 2022-10-20 00:00:00.000

SELECT date_trunc('month' , TIMESTAMP '2022-10-20 05:10:00');
-- 2022-10-01 00:00:00.000

SELECT date_trunc('year', TIMESTAMP '2022-10-20 05:10:00');
-- 2022-01-01 00:00:00.000

간격 함수 (Interval functions)

이 섹션의 함수는 다음 간격 단위를 지원합니다:

단위 설명
millisecond 밀리초
second
minute
hour 시간
day
week
month
quarter 분기
year

date_add(unit, value, timestamp) → [입력과 동일]

timestampunit 유형의 간격 value를 더합니다. 음수 값을 사용해 뺄셈을 수행할 수 있습니다:

SELECT date_add('second', 86, TIMESTAMP '2020-03-01 00:00:00');
-- 2020-03-01 00:01:26.000

SELECT date_add('hour', 9, TIMESTAMP '2020-03-01 00:00:00');
-- 2020-03-01 09:00:00.000

SELECT date_add('day', -1, TIMESTAMP '2020-03-01 00:00:00 UTC');
-- 2020-02-29 00:00:00.000 UTC

date_diff(unit, timestamp1, timestamp2) → bigint

unit 단위로 표현된 timestamp2 - timestamp1을 반환합니다:

SELECT date_diff('second', TIMESTAMP '2020-03-01 00:00:00', TIMESTAMP '2020-03-02 00:00:00');
-- 86400

SELECT date_diff('hour', TIMESTAMP '2020-03-01 00:00:00 UTC', TIMESTAMP '2020-03-02 00:00:00 UTC');
-- 24

SELECT date_diff('day', DATE '2020-03-01', DATE '2020-03-02');
-- 1

SELECT date_diff('second', TIMESTAMP '2020-06-01 12:30:45.000000000', TIMESTAMP '2020-06-02 12:30:45.123456789');
-- 86400

SELECT date_diff('millisecond', TIMESTAMP '2020-06-01 12:30:45.000000000', TIMESTAMP '2020-06-02 12:30:45.123456789');
-- 86400123

기간 함수 (Duration function)

parse_duration 함수는 다음 단위를 지원합니다:

단위 설명
ns 나노초
us 마이크로초
ms 밀리초
s
m
h 시간
d

parse_duration(string) → interval

value unit 형식의 string을 간격으로 파싱합니다. 여기서 valueunit 값들의 분수 숫자입니다:

SELECT parse_duration('42.8ms');
-- 0 00:00:00.043

SELECT parse_duration('3.81 d');
-- 3 19:26:24.000

SELECT parse_duration('5m');
-- 0 00:05:00.000

human_readable_seconds(double) → varchar

seconds의 double 값을 weeks, days, hours, minutes, seconds를 포함하는 사람이 읽을 수 있는 문자열로 포맷합니다:

SELECT human_readable_seconds(96);
-- 1 minute, 36 seconds

SELECT human_readable_seconds(3762);
-- 1 hour, 2 minutes, 42 seconds

SELECT human_readable_seconds(56363463);
-- 93 weeks, 1 day, 8 hours, 31 minutes, 3 seconds

MySQL 날짜 함수 (MySQL date functions)

이 섹션의 함수는 MySQL date_parsestr_to_date 함수와 호환되는 형식 문자열을 사용합니다. 다음 표는 MySQL 매뉴얼에 기반한 형식 지정자를 설명합니다:

지정자 설명
%a 약식 요일 이름 (Sun .. Sat)
%b 약식 월 이름 (Jan .. Dec)
%c 월, 숫자 (1 .. 12). 이 지정자는 0을 월로 지원하지 않습니다.
%D 영어 접미사가 있는 월 중 일자 (0th, 1st, 2nd, 3rd, …)
%d 월 중 일자, 숫자 (01 .. 31). 이 지정자는 월이나 일자로 0을 지원하지 않습니다.
%e 월 중 일자, 숫자 (1 .. 31). 이 지정자는 일자로 0을 지원하지 않습니다.
%f 초의 분수 (출력은 6자리: 000000 .. 999000; 파싱은 1-9자리: 0 .. 999999999), 타임스탬프는 밀리초로 절삭됩니다.
%H 시간 (00 .. 23)
%h 시간 (01 .. 12)
%I 시간 (01 .. 12)
%i 분, 숫자 (00 .. 59)
%j 연중 일 (001 .. 366)
%k 시간 (0 .. 23)
%l 시간 (1 .. 12)
%M 월 이름 (January .. December)
%m 월, 숫자 (01 .. 12). 이 지정자는 0을 월로 지원하지 않습니다.
%p AM 또는 PM
%r 하루 중 시간, 12시간 (%h:%i:%s %p와 동일)
%S 초 (00 .. 59)
%s 초 (00 .. 59)
%T 하루 중 시간, 24시간 (%H:%i:%s와 동일)
%U 주 (00 .. 53), 일요일이 주의 첫 날
%u 주 (00 .. 53), 월요일이 주의 첫 날
%V 주 (01 .. 53), 일요일이 주의 첫 날; %X와 함께 사용
%v 주 (01 .. 53), 월요일이 주의 첫 날; %x와 함께 사용
%W 요일 이름 (Sunday .. Saturday)
%w 주 중 일 (0 .. 6), 일요일이 주의 첫 날. 이 지정자는 지원되지 않으며 day_of_week()(0-6 대신 1-7 사용)를 고려하세요.
%X 일요일이 주의 첫 날인 주의 연도, 숫자 4자리; %V와 함께 사용
%x 월요일이 주의 첫 날인 주의 연도, 숫자 4자리; %v와 함께 사용
%Y 연도, 숫자 4자리
%y 연도, 숫자 (두 자리). 파싱 시 두 자리 연도는 1970 .. 2069 범위를 가정하므로 "70"은 연도 1970이 되지만 "69"는 2069를 만듭니다.
%% 리터럴 % 문자
%x 위에 없는 모든 x에 대해 ## x

다음 지정자는 현재 지원되지 않습니다: %D %U %u %V %w %X

date_format(timestamp, format) → varchar

format을 사용해 timestamp를 문자열로 포맷합니다:

SELECT date_format(TIMESTAMP '2022-10-20 05:10:00', '%m-%d-%Y %H');
-- 10-20-2022 05

date_parse(string, format) → timestamp(3)

format을 사용해 string을 타임스탬프로 파싱합니다:

SELECT date_parse('2022/10/20/05', '%Y/%m/%d/%H');
-- 2022-10-20 05:00:00.000

Java 날짜 함수 (Java date functions)

이 섹션의 함수는 JodaTime의 DateTimeFormat 패턴 형식과 호환되는 형식 문자열을 사용합니다.

format_datetime(timestamp, format) → varchar

format을 사용해 timestamp를 문자열로 포맷합니다.

parse_datetime(string, format) → timestamp with time zone

format을 사용해 string을 시간대가 있는 타임스탬프로 파싱합니다.

추출 함수 (Extraction function)

extract 함수는 다음 필드를 지원합니다:

필드 설명
YEAR year()
QUARTER quarter()
MONTH month()
WEEK week()
DAY day()
DAY_OF_MONTH day()
DAY_OF_WEEK day_of_week()
DOW day_of_week()
DAY_OF_YEAR day_of_year()
DOY day_of_year()
YEAR_OF_WEEK year_of_week()
YOW year_of_week()
HOUR hour()
MINUTE minute()
SECOND second()
TIMEZONE_HOUR timezone_hour()
TIMEZONE_MINUTE timezone_minute()

extract 함수가 지원하는 유형은 추출할 필드에 따라 다릅니다. 대부분 필드는 모든 날짜와 시간 유형을 지원합니다.

extract(field FROM x) → bigint

x에서 field를 반환합니다:

SELECT extract(YEAR FROM TIMESTAMP '2022-10-20 05:10:00');
-- 2022

이 SQL 표준 함수는 인수를 지정하는 특별한 문법을 사용합니다.

편의 추출 함수 (Convenience extraction functions)

day(x) → bigint

x에서 월 중 일자를 반환합니다. x의 유형은 date, timestamp, timestamp with time zone일 수 있습니다.

day_of_month(x) → bigint

day()의 별칭입니다.

day_of_week(x) → bigint

x에서 ISO 주 중 일자를 반환합니다. 값은 1(월요일)부터 7(일요일)까지입니다. x의 유형은 date, timestamp, timestamp with time zone일 수 있습니다.

day_of_year(x) → bigint

x에서 연중 일자를 반환합니다. 값은 1부터 366까지입니다. x의 유형은 date, timestamp, timestamp with time zone일 수 있습니다.

dow(x) → bigint

day_of_week()의 별칭입니다.

doy(x) → bigint

day_of_year()의 별칭입니다.

hour(x) → bigint

x에서 시간을 반환합니다. 값은 0부터 23까지입니다. x의 유형은 time, time with time zone, timestamp, timestamp with time zone일 수 있습니다.

millisecond(x) → bigint

x에서 초의 밀리초를 반환합니다. x의 유형은 time, time with time zone, timestamp, timestamp with time zone일 수 있습니다.

minute(x) → bigint

x에서 시간의 분을 반환합니다. x의 유형은 time, time with time zone, timestamp, timestamp with time zone일 수 있습니다.

month(x) → bigint

x에서 연의 월을 반환합니다. x의 유형은 date, timestamp, timestamp with time zone일 수 있습니다.

quarter(x) → bigint

x에서 연의 분기를 반환합니다. 값은 1부터 4까지입니다. x의 유형은 date, timestamp, timestamp with time zone일 수 있습니다.

second(x) → bigint

x에서 분의 초를 반환합니다. x의 유형은 time, time with time zone, timestamp, timestamp with time zone일 수 있습니다.

timezone_hour(timestamp) → bigint

timestamp에서 시간대 오프셋의 시간을 반환합니다.

timezone_minute(timestamp) → bigint

timestamp에서 시간대 오프셋의 분을 반환합니다.

week(x) → bigint

x에서 연의 ISO 주를 반환합니다. 값은 1부터 53까지입니다. x의 유형은 date, timestamp, timestamp with time zone일 수 있습니다.

week_of_year(x) → bigint

week()의 별칭입니다.

year(x) → bigint

x에서 연도를 반환합니다. x의 유형은 date, timestamp, timestamp with time zone일 수 있습니다.

year_of_week(x) → bigint

x에서 ISO 주의 연도를 반환합니다. x의 유형은 date, timestamp, timestamp with time zone일 수 있습니다.

yow(x) → bigint

year_of_week()의 별칭입니다.

timezone(timestamp(p) with time zone) → varchar

timestamp(p) with time zone에서 시간대 식별자를 반환합니다. 반환 식별자의 형식은 입력 타임스탬프에 사용된 형식과 동일합니다:

SELECT timezone(TIMESTAMP '2024-01-01 12:00:00 Asia/Tokyo'); -- Asia/Tokyo
SELECT timezone(TIMESTAMP '2024-01-01 12:00:00 +01:00'); -- +01:00
SELECT timezone(TIMESTAMP '2024-02-29 12:00:00 UTC'); -- UTC

timezone(time(p) with time zone) → varchar

time(p) with time zone에서 시간대 식별자를 반환합니다. 반환 식별자의 형식은 입력 시간에 사용된 형식과 동일합니다:

SELECT timezone(TIME '12:00:00+09:00'); -- +09:00

더 알아보기 (Learn more)

날짜와 시간 값을 다룰 때 변환 함수와 형식 지정 방식도 함께 알아두면 좋아요. 날짜 포맷팅은 변환 함수 문서의 format()에서도 확인할 수 있어요.