날짜 및 시간 함수와 연산자들

  • 주의사항 : 아래 함수와 연산자들의 설명에 포함되어 있는 예제들은 타임존 (time zone) 에 따라 결과가 달라질 수 있습니다.
add_days(date date|timestamp, day int)

입력한 기준 날짜에서 입력한 날 만큼을 더한 새로운 날짜를 돌려줍니다.

인자 date:기준이 되는 타임스탬프나 날짜
인자 day:기준 날짜에 더하고자 하는 날
리턴타입:timestamp
예제:
select add_days(date '2013-12-30', 5);
> 2014-01-03 15:00:00

select add_days(timestamp '2013-12-05 12:10:20', -7);
> 2013-11-28 03:10:20
add_months(date date|timestamp, month int)
입력된 달 만큼 입력한 날짜 혹은 타임스탬프에 더한 날짜를 돌려줍니다.
인자 date:기준이 되는 날자나 타임스탬프
인자 month:기준 날짜에 더해질 달
리턴타입:timestamp
예제:
select add_months(date '2013-12-17', 2);
> 2014-02-16 15:00:00
current_date()

현재 날짜를 (yyyy-mm-dd) 포맷으로 돌려줍니다.

리턴타입:date
select current_date();
> 2014-09-23
current_time()
현재 시간을 돌려줍니다.
리턴타입:time
select current_time();
> 05:18:27.651999
extract(field FROM source)
입력된 날짜 혹은 시간값에 대해 field 인자로 입력한 년도 혹은 시간 같은 특정 학목값을 돌려줍니다. source 인자는 timestamp, 혹은 time 타입이어야 합니다. (date 타입은 timestamp 타입으로 캐스팅 되므로, 두 타입 모두 사용할 수 있습니다.) field 인자는 source 인자로부터 출력하고자 하는 항목에 대한 정보입니다. 이 함수는 배정밀도 (double precision) 값을 돌려줍니다. 아래는 field 인자로 사용될 수 있는 여러 항목들에 대한 예제입니다.

century

입력된 값으로 부터 세기에 대한 값을 돌려줍니다.
select extract(century from timestamp '2001-12-16 12:21:13');
> 21.0

1세기는 0001-01-01 00:00:00 AD에 시작됩니다. 따라서, 그레고리안 달력을 적용한 모든 나라에서 올바른 세기 값을 얻을 수 있습니다. 세기는 0부터 시작하지 않습니다.

day

timestamp 값에서, 날짜는 1에서 31까지의 값을 가질 수 있습니다.

select extract(day from timestamp '2001-02-16 20:38:40');
> 16.0

decade

입력된 값으로 부터 년도 값을 10으로 나눈 값을 돌려줍니다.
select extract(decade from timestamp '2001-02-16 20:38:40');
> 200.0

dow

입력된 값으로 부터 입력된 시간값으로 부터 요일을 0 (일요일) 부터 6 (토요일) 로 변환해 돌려줍니다.

select extract(dow from timestamp '2001-02-16 20:38:40');
> 5.0

해당 함수는 to_char(..., ‘D’) 함수와는 다르게 동작합니다.

doy

입력된 값으로 부터 해당 년도 중 몇번째 일인지를 돌려줍니다.

select extract(doy from timestamp '2001-02-16 20:38:40');
> 47.0

hour

입력된 값으로 부터 시간값 (0 ~ 23)을 돌려줍니다.
select extract(hour from timestamp '2001-02-16 20:38:40');
> 20.0

isodow

입력된 값으로 부터 요일정보를 1 (월요일) 부터 7 (일요일) 로 변환해 돌려줍니다.

select extract(isodow from timestamp '2001-02-18 20:38:40');
> 7.0

이 함수는 일요일에 대한 값을 제외하면 dow함수와 동일하게 동작합니다. 이는 ISO 8601에 명시된 한 주의 요일에 대한 넘버링 방법을 따릅니다.

isoyear

입력된 값으로 부터 ISO 8601 기준에 따르는 년도를 돌려줍니다.

select extract(isoyear from date '2006-01-01');
> 2005.0

ISO 년도는 4주로 구성된 1월의 첫번째 월요일 에서 시작됩니다. 그래서, 1월 초나 12월 말의 어느날은 그레고리안 달력과 다른 년도값을 돌려줄 수 도 있습니다. 자세한 정보를 위해서는 week 항목을 참조해 세요.

microseconds

입력된 값으로부터 마이크로초 단위로 소숫점을 포함한 초 정보를 변환하여 돌려줍니다. 이는 입력 값에 포함된 초 정보를 1,000,000과 곱하는 연산을 통해 이루어집니다.
select extract(microseconds from time '17:12:28.5');
> 2.85E7

millennium

The millennium
입력된 값으로 부터 천년 단위로 시간정보를 변환해 돌려줍니다.
select extract(millennium from timestamp '2001-02-16 20:38:40');
> 3.0

1900년도 대의 모든 년도는 두번째 millennium에 속합니다. 세번 째 millennium은 2001년 1월 1일부터 시작되었습니다.

milliseconds

입력된 값으로 부터 밀리초 단위로 소숫점을 포함한 초 정보를 변환하여 돌려줍니다. 이는 입력 값에 포함된 초 정보를 1,000과 곱하는 연산을 통해 이루어집니다.

select extract(milliseconds from time '17:12:28.5');
> 28500.0

minute

입력된 값으로 부터 분 정보 (0~59) 를 반환합니다.

select extract(minute from timestamp '2001-02-16 20:38:40');
> 38.0

month

입력된 값으로 부터 달 정보 (1~12) 를 반환합니다.
select extract(month from timestamp '2001-02-16 20:38:40');
> 2.0

quarter

입력된 값이 어떤 분기 (1~4) 에 속하는 지를 계산하여 반환합니다.

select extract(quarter from timestamp '2001-02-16 20:38:40');
> 1.0

second

입력된 값으로 부터 초 정보 (0~59) 를 반환합니다.

select extract(second from timestamp '2001-02-16 20:38:40');
> 40.0

week

일 년중 몇번째 주 인지를 나타냅니다. ISO 8601에 따르면, 첫번째 주는 1월 4일을 포함하는 주에서 시작됩니다. 따라서, 그 주의 1일은 목요일 입니다. ISO 정의에서, 일월 초의 몇몇 요일들은 일년 전 년도의 52번째 와 53번째 주 사이에 속할 가능성이 있습니다. 또한, 12월 말의 몇몇 요일들은 다음 년도의 첫번째 주에 속할 수 있습니다. 예를 들어, 2005-01-01 은 2004년도의 53번째 주에 속하고, 2006-01-01 은 2005년도의 52번째 주에 속하지만, 2012-12-31은 2013년도의 첫번째 주에 속합니다. 일관된 주 정보를 얻기 위해 isoyear 항목과 주 정보를 함께 사용하는것을 추천합니다.
select extract(week from timestamp '2001-02-16 20:38:40');
> 7.0

year

입력된 값에서 년도 정보를 반환합니다. 참고로 기원 후 0년이라는 년도는 없기 때문에, 기원 전 년도와 기원 후 년도 간의 연산 (특히 기원 전 년도에서 기원 후 년도를 빼는 연산) 은 주의하여 수행하여야 합니다.
select extract(year from timestamp '2001-02-16 20:38:40');
> 2001.0

extract 함수는 컴퓨터를 활용한 여러가지 연산을 위 만들어졌습니다.

타조는 date_part 함수 역시 지원합니다. 이는 SQL 표준의 extract 함수와 동일하게 동작합니다.
date_part('field', source)

field 인자는 extract 함수와 동일 하게 사용하여도 됩니다. 하지만 문자열로 입력하셔야 합니다. (extract 함수는 field 인자로 문자열이 아닌 항목이름을 그대로 입력하 사용합니다.)

select date_part('day', timestamp '2001-02-16 20:38:40');
> 16.0
now()

현재 타임스탬프를 돌려줍니다.

리턴타입:timestamp
예제:
select now();
> 2014-09-23 08:32:43.286
to_char(src timestamp, format text)
입력한 타임스탬프를 입력한 format에 맞추어 text 타입으로 변환하여 돌려줍니다. 자세한 정보는 아래의 ‘Date/Time 포맷팅과 변환’ 섹션에 기술되어 있습니다.
인자 src:text 타입으로 변환하고자 하는 타임스탬프
인자 format:문자열로 표현한 포맷
리턴타입:text
select to_char(current_timestamp, 'yyyy-MM-dd');
> 2014-09-23
to_date(src text, format text)
입력된 text를 입력한 format에 맞추어 date 타입으로 변환합니다. 자세한 정보는 아래의 ‘Date/Time 포맷팅과 변환’ 섹션에 기술되어 있습니다.
인자 src:date 타입으로 변환하고자 하는 text
인자 format:문자열로 표현한 포맷
리턴타입:date
select to_date('2014-01-04', 'YYYY-MM-DD');
> 2014-01-04
to_timestamp(epoch int)
입력한 유닉스 시간을 타임스탬프 타입으로 변환하여 돌려줍니다.
인자 epoch:int 타입의 유닉스 시간
리턴타입:timestamp
select to_timestamp(412312345);
> 1983-01-25 03:12:25
to_timestamp(src text, format text)

text타입으로 입력된 타임스탬프를 타임스탬프 타입으로 변환하여 돌려줍니다. 자세한 정보는 아래의 ‘Date/Time 포맷팅과 변환’ 섹션에 기술되어 있습니다.

인자 src:변환하고자 하는 text타입의 타임스탬프 정보timestamp string to be converted
인자 format:문자열로 표현한 포맷
리턴타입:timestamp
select to_timestamp('97/2/16 8:14:30', 'FMYYYY/FMMM/FMDD FMHH:FMMI:FMSS');
> 0097-02-15 23:14:30
utc_usec_to(string text, long timestamp, int dayOfWeek)
  • 첫 번째 인자 가 ‘day’일 경우.

    입력된 유닉스 타임스탬프가 나타내는 날짜가 시작되는 시점의 타임스탬프 값을 돌려줍니다. 예를 들어, 유닉스 타임스탬프값이 May 19th at 08:58 를 나타냈을때, 이 함수는 May 19th at 00:00 을 나타내는 유닉스 타임스탬프 값을 돌려줍니다.

  • 첫 번째 인자 가 ‘hour’ 일 경우..

    입력된 유닉스 타임스탬프가 나타내는 시간이 시작되는 시점의 타임스탬프 값을 돌려줍니다. 예를 들어, 유닉스 타임스탬프값이 08:58 를 나타낸다면, 이 함수는 같은 날 08:00 정각의 유닉스 타임스탬프 값을 돌려줍니다.

  • 첫 번째 인자 가 ‘month’ 일 경우..

    입력된 유닉스 타임스탬프가 나타내는 달이 시작되는 시점의 타임스탬프 값을 돌려줍니다. 예를 들어, 유닉스 타임스탬프값이 March 19th 를 나타낸다면, 이 함수는 같은 년도의 March 1일을 나타내는 유닉스 타임스탬프 값을 돌려줍니다.

  • 첫 번째 인자 가 ‘year’ 일 경우..

    입력된 유닉스 타임스탬프가 나타내는 년도가 시작되는 시점의 타임스탬프 값을 돌려줍니다. 예를 들어, 유닉스 타임스탬프값이 2010년 중의 시간을 나타낸다면, 이 함수는 2010-01-01 00:00 의 유닉스 타임스탬프 값인 1274259481071200 을 돌려줍니다.

  • 첫 번째 인자 가 ‘week’ 이고 세번째 인자 가 2 (화요일) 일 경우.

    입력된 유닉스 타임스탬프가 포함된 주에서 특정 요일이 시작되는 시점의 타임스탬프 값을 돌려줍니다. 예를 들어, 유닉스 타임스탬프 값이 2008-04-11 (금요일) 나타내고, day_of_week 값으로 2 (화요일)을 인자로 입력하였다면, 이 함수는 2008-04-08 (화요일) 을 나타내는 유닉스 타임스탬프 값을 돌려줍니다.

인자 string:‘day’, ‘hour’, ‘month’, ‘year’, 그리고 ‘week’ 중 하나
인자 long:특정 시각을 나타내는 유닉스 타임스탬프
인자 int:특정 요일을 표현하는 숫자, 0 (일요일) ~ 6 (토요일). ‘week’ 인자를 첫번째 인자로 입력하였을때 추가적으로 필요한 인자입니다.
리턴타입:long
예제:
SELECT utc_usec_to('day', 1274259481071200);
> 1274227200000000

Date/Time 포맷팅과 변환

Date/Time 포맷팅을 위한 탬플릿 패턴들 =========================== ================================================================ 패턴 설명 =========================== ================================================================ HH 해당 날의 시간 (01-12) HH12 해당 날의 시간 (01-12) HH24 해당 날의 시간 (00-23) MI 분 (00-59) SS 초 (00-59) MS 밀리초 (000-999) US 마이크로초 (000000-999999) SSSS 해당 날의 자정으로 부터 현재 시간까지 지난 초 (0-86399) AM, am, PM or pm meridiem 지시자 (마침표 미포함) A.M., a.m., P.M. or p.m. meridiem 지시자 (마침표 포함) Y,YYY 컴마가 포함된 년 (네 자리 이상의 숫자) YYYY 년도 (네 자리 이상의 숫자) YYY 년도의 마지막 세자리 숫자 YY 년도의 마지막 두자리 숫자 Y 년도의 마지막 한자리 숫자 IYYY ISO 년도 (네 자리 이상의 숫자) IYY ISO 년도의 마지막 세자리 숫자 IY ISO 년도의 마지막 두자리 숫자 I ISO 년도의 마지막 한자리 숫자 BC, bc, AD or ad era 지시자 (마침표 미포함) B.C., b.c., A.D. or a.d. era 지시자 (마침표 포함) MONTH 대문자로 표기한 달의 영문 이름 (공백을 추가해 9자리 문자로 표기) Month 첫번째 글자만 대문자로 표기한 달의 영문 이름 (공백을 추가해 9자리 문자로 표기) month 소문자로 표기한 달의 영문 이름 (공백을 추가해 9자리 문자로 표기) MON 대문자로 축약된 달의 영문 이름 (3개의 알파멧으로 표기) Mon 첫번째 글자만 대문자로 표기하여 축약한 달의 영문 이름 (3개의 알파멧으로 표기) mon 소문자로 축약된 달의 영문 이름 (3개의 알파멧으로 표기) MM 숫자로 표기된 달 (01-12) DAY 대문자로 표기한 요일의 영문 이름 (공백을 추가해 9자리 문자로 표기) Day 첫번째 글자만 대문자로 표기한 요일의 영문 이름 (공백을 추가해 9자리 문자로 표기) day 대문자로 표기한 요일의 영문 이름 (공백을 추가해 9자리 문자로 표기) DY 대문자로 축약된 요일의 영문 이름 (3개의 알파멧으로 표기) Dy 첫번째 글자만 대문자로 표기한 요일의 영문 이름 (3개의 알파멧으로 표기) dy 소문자로 축약된 요일의 영문 이름 (3개의 알파멧으로 표기) DDD 해당 년도의 시작부터 지금까지 지난 날 (001-366) IDDD 해당 ISO 년도의 시작부터 지금까지 지난 날 (001-371; ISO 년도의 첫쨋날은 첫번째 주에 포함되어 있습니다.) DD 해당 달의 시작부터 지금까지 지난 날 (01-31) D 해당 주의 요일. 일요일 (1) 부터 토요일 (7) 로 표기 ID 해당 ISO 주의 요일. 일요일 (1) 부터 토요일 (7) 로 표기 W 해당 달의 주 (1-5) (첫번째 주는 해당 달의 첫번째 날부터 시작됩니다.) WW 해당 년도의 주 (1-53) (첫번째 주는 해당 년도의 첫번째 날부터 시작됩니다.) IW 해당 ISO 년도의 주 (0-53, 해당 년도의 첫번째 목요일은 첫번째 주의 1일 입니다.) CC 세기 (2 자리 수, 21세기는 2001-01-01에 시작됬습니다.) J 율리우스 일 (기원 전 4713년 1월 1일 부터의 일수) Q 분기 (to_date 함수와 to_timestamp 함수에서는 적용되지 않음) RM 대문자의 로마 숫자로 표기된 달 (I-XII; I=January) rm 소문자의 로마 숫자로 표기된 달 (i-xii; i=January) TZ 대문자로 표기된 타임존 이름 tz 소문자로 표기된 타임존 이름 =========================== ================================================================

Date/Time 포맷팅을 위한 템플릿 패턴 수식어들 =========== ======================================================================= ================ 수식어 설명 예제 =========== ======================================================================= ================ FM (접두사) 채우기 모드 (빈칸 혹은 0으로 공백을 채우지 않음) FMMonth TH (접미사) 대문자 서수 표시 접미사 DDTH, 12TH th (접미사) 소문자 서수 표시 접미사 DDth, 12th FX (접두사) fixed format global option (see usage notes) FX Month DD Day TM (접두사) translation mode (print localized day and month names based on lc_time) TMMonth SP (접미사) spell mode (not implemented) DDSP =========== ======================================================================= ================

  • FM 접두사는 길게 늘어진 공백 혹은 0으로 공백을 채우지 않습니다. FM 접두사가 없다면, 고정길이로 패턴을 출력할 수 있습니다. 타조에서는 FM 접두사 바로 이후의 패턴에 대해서만 적용됩니다. 이는 오라클의 FM 적용 (FM 접두사 이후 모든 패턴에 대해 적용)과는 조금 다릅니다. FM의 반복된 사용은 채우기 모드를 on/off 합니다.
  • TM 접두사는 길게 늘어진 공백을 허용하지 않습니다.
  • to_timestamp 함수와 to_date 함수는 FX 접두사가 사용되지 않을 경우 입력 문자열에 있는 여러 공백을 건너뜁니다. 예를 들어, to_timestamp (‘2000 JUN’, ‘YYYY MON’) 은 동작하지만, to_timestamp (‘2000 JUN’, ‘FXYYYY MON’) 의 경우 오류가 발생하는데, 이는 to_timestamp 함수는 오직 하나의 공백만 허용하기 때문입니다. FX 접두사는 반드시 탬플릿의 첫번째 아이템으로 사용되어야 합니다.
  • 서수 text는 to_char 탬플릿에 허용 되며 리터럴로 출력 됩니다. 큰 따옴표 내의 보조 문자열은 리터럴 text로 인식되며 이는 패턴 키워드를 포함할 경우에도 적용됩니다. 예를 들어, ‘“Hello Year “YYYY’에서, YYYY 는 년도 데이터로 치환되지만 Year 단어 내의 대문자 Y는 큰 따옴표 안에 위치하기 때문에 리터럴로 인식되어 년도 정보로 변환되지 않습니다. to_date, to_number, 그리고 to_timestamp 함수들에서도, 큰 따옴표 내의 문자열은 문자열에 포함되어 있는 입력문자의 수만큼 입력 문자들을 건너뜁니다. 예를 들어, “XX”는 두개의 입력 문자를 건너뜁니다.
  • 큰 따옴표를 사용하고자 한다면, 백슬래쉬 () 를 먼저 사용해 주세요. (예: ‘“YYYY Month”’)
  • 년도 포맷이 4자리 이하로 표기되거나 (예: YYY), 지원되는 년도가 4자리 이하라면, 2020년과 가장 가까운 년도로 대체됩니다. 예를 들어, 95의 경우 2995년도 보다 1995년도가 2020 년도와 가까우므로 1995로 표기됩니다.
  • 문자열에서 타임스탬프 혹은 날짜 타입으로의 YYYY 변환의 경우 4개 이상의 수를 포함하는 년도에 대해서는 사용이 제한됩니다. 따라서 YYYY 포맷 이후에 문자 혹은 탬플릿을 반드시 사용하여야 합니다. 그렇지 않을 경우 년도에 대한 표현은 4자리 숫자로만 표현되어 정확한 년도 표기가 되지 않습니다. 예를 들어, to_date (‘200001131’, ‘YYYYMMDD’) 함수의 경우 5자리가 아닌 4자리로만 년도를 표기합니다. 대신 to_date (‘20000-1131’, ‘YYYY-MMDD’) 혹은 to_date (‘20000Nov31’, ‘YYYYMonDD’) 처럼 년도 뒤에 숫자가 아닌 구분자 혹은 문자표현을 사용하여 원하는 년도 정보를 얻을 수 있습니다.
  • 문자열을 타임스탬프 혹은 날짜 타입으로 변환할 때, CC (세기) 항목은 YYY, YYYY 혹은 Y,YYY 항목이 있을 경우 무시됩니다. 만약 CC 가 YY 혹은 Y 와 함께 사용된다면, 년도의 계산은 지정된 특정 세기를 고려하여 계산됩니다. 만약 세기가 입력되었으나 년도가 입력되지 않았다면, 해당 세기의 첫번째 년도로 가정합니다.
  • ISO 주 날짜 (그레고리안 날짜가 아닌) 는 to_timestamp 함수와 to_date 함수를 아래 두가지 방법중 한가지 방법으로 구체화 시킬 수 있습니다:
  • 년도, 주 그리고 평일에 관한 예제: to_date (‘2006-42-4’, ‘IYYY-IW-ID’) 함수는 2006-10-19 를 돌려줍니다. 이 예제에서 평일을 제외하면 1 (월요일)로 가정합니다.
  • 년도와 년도의 달에 관한 예제: to_date (‘2006-291’, ‘IYYY-IDDD’) 함수 또한 2006-10-19 을 돌려줍니다.
  • ISO 주와 그레고리안 날짜의 혼합 사용은 올바르지 않으며, 오류를 유발하게 됩니다. ISO 년도 개념에서, “달”, 혹은 “달의 날짜” 와 같은 개념은 의미가 업습니다. 또한, 그레고리안 날짜의 개념에서, ISO 주의 사용은 의미가 없습니다. 사용자는 반드시 두 개념을 구분하여 사용하여야 합니다.
  • 문자열에서 타임스탬프 타입으로 변환할때, 밀리초 (MS) 혹은 마이크로초 (US) 는 소수점 이하의 숫자들에 사용됩니다. 예를 들어, to_timestamp (‘12:3’, ‘SS:MS’) 변환의 결과는 3 밀리초가 아닌 300 밀리초입니다. 왜냐하면 이 변환은 12 + 0.3 초와 같은 형태로 시간을 표현하기 때문입니다. 이는 SS:MS 포맷의 경우, 입력값으로 12:3, 12:30, 그리고 12:300 이 주어진다면 이 모든 입력값이 모두 같은 밀리초 값을 가지고 있다는 의미입니다. 3 밀리초를 표현하고자 한다면, 12:003 와 같은 형태로 표현해야 합니다. 이는 변환시 12 + 0.003 = 12.003 초 로 표현하기 때문입니다.
  • Here is a more complex 예제: to_timestamp (‘15:12:02.020.001230’, ‘HH:MI:SS.MS.US’) is 15 hours, 12 minutes, and 2 seconds + 20 milliseconds + 1230 microseconds = 2.021230 seconds.
  • to_char (..., ‘ID’) 함수의 특정 주의 날짜 수치화의 출력값은 (isodow from ...) 함수와 일치하지만, to_char (..., ‘D’) 함수의 경우 extract(dow from ...) 함수의 날짜 수치화 결과와 다릅니다.
  • to_char (interval) 함수는 HH와 HH12에 대해 12시간 시각으로 포맷팅을 수행합니다. 예를 들어, 0시와 36시는 12시로 출력됩니다. 이는 HH24 포맷이 나타내는 24시간 시각 포맷 (0~23) 과 다릅니다.