PostgreSQL | 데이터 형식(Data type) | 날짜/시간 형식(timestamp, interval, data 등)

여기에서는 날짜 / 시간 데이터 형식에 대해 설명한다.

날짜/시간 형식

사용 가능한 형식은 다음과 같다.

형식 크기 설명 별칭
timestamp [(p)] [without time zone] 8 바이트 날짜와 시간 모두
timestamp [(p)] [with time zone] 8 바이트 날짜와 시간 모두 시간대 포함 timestamptz
interval [(p)] 12 바이트 시간 간격
date 4 바이트 날짜
time [(p)] [without time zone] 8 바이트 시간
time [(p)] with time zone 12 바이트 시간, 시간대 첨부 timetz

time 형이나 timestamp 데이터 형식의 선택적 인수(p)는 초의 소수점 이하의 정밀도를 지정이다. 허용되는 p범위는 타임 스탬프 및 간격 유형에 대해 0에서 6까지이다.

날짜와 시간 입력은 다양한 포멧으로 가능하지만, 판단할지 애매한 경우는 DateStyle 따라 달라진다. DateStyle는 예를 들어 날짜가 “년 월 일” 순서으로 작성되어 있는지 “월 일 년” 순서로 기술되어 있는지 등을 지정하는 것이다. 아래에서는 어떤 DataStyle도 제대로 해석되는 포맷만을 일단 보도록 한다.

날짜 입력 방법은 다음과 같다.

January 8, 1999
1999-01-08
1999-Jan-08
Jan-08-1999
08-Jan-1999
19990108
990108
1999.008      ※ 연도와 그 일까지의 합계

시간 입력 방법은 다음과 같다.

04:05:06.789
04:05:06
04:05
040506
04:05 AM     ※ = 04:05
04:05 PM     ※ = 16:05

시간도 포함한 시간 입력 방법은 다음과 같다.

04:05:06 PST
04:05:06+09:00
04:05:06+0900
04:05:06+09

※ 한국 표준 시간의 경우 “+09:00"이다.

날짜 입력시 월명으로 사용할 수있는 값은 다음과 같다.

January     Jan         ※ 1월
February    Feb         ※ 2월
March       Mar         ※ 3월
April       Apr         ※ 4월
May                     ※ 5월
June        Jun         ※ 6월
July        Jul         ※ 7월
August      Aug         ※ 8월
September   Sep、Sept   ※ 9월
October     Oct         ※10월
November    Nov         ※11월
December    Dec         ※12월

날짜와 시간은 작은 따옴표로 묶어 작성한다. 각 유형의 경우 입력 예는 아래와 같다.

timestamp                     '2004-10-19 10:23:54'
timestamp with time zone      '2004-10-19 10:23:54+09'
date                          '2004-10-19'
time                          '10:23:54'
time with time zone           '10:23:54+09'

시간 간격 형 interval 형은 시간 지정한 시간만큼을 연산을 할 경우에 사용한다.

예를 들면, 현재 시간보다 30분 전 시간을 구하려면 아래와 같이 구하면 된다.

devkuma=# select now(), now() - interval'30 minute';
              now              |           ?column?
-------------------------------+-------------------------------
 2020-10-24 00:51:55.780337+09 | 2020-10-24 00:21:55.780337+09
(1개 행)


devkuma=#

현재 시간보다 하루 전 날짜 구하는 방법은 아래와 같다.

devkuma=# select now(), now()::date - '1 day'::interval;
              now              |      ?column?
-------------------------------+---------------------
 2020-10-24 00:52:48.932335+09 | 2020-10-23 00:00:00
(1개 행)


devkuma=#

그밖에 사용법

현재 시간 조회하는 방법은 아래와 같다.

devkuma=# select now();
              now
-------------------------------
 2020-10-24 01:46:31.014282+09
(1 )

현재 타임존 조회하는 방법은 아래와 같다.

devkuma=# show timezone;
  TimeZone
------------
 Asia/Seoul
(1 )

타임존 변경 방법하는 방법은 아래와 같다.

devkuma=# SET TIME ZONE 'Asia/Seoul';
SET
devkuma=#

시스템 일자를 조회하는 방법은 아래와 같다.

devkuma=# select current_date, current_time, timeofday();
 current_date |    current_time    |              timeofday
--------------+--------------------+-------------------------------------
 2020-10-24   | 01:45:50.757997+09 | Sat Oct 24 01:45:50.765987 2020 KST
(1 )


devkuma=# select now(), current_timestamp, timestamp 'now';
              now              |       current_timestamp       |         timestamp
-------------------------------+-------------------------------+----------------------------
 2020-10-24 01:46:02.990667+09 | 2020-10-24 01:46:02.990667+09 | 2020-10-24 01:46:02.990667
(1 )

날짜에서 년도를 추출하는 방법은 아래와 같다.

devkuma=# select date_part('year', timestamp '2020-07-30 20:38:40');
 date_part
-----------
      2020
(1 )


devkuma=# select date_part('year', current_timestamp);
 date_part
-----------
      2020
(1 )


devkuma=# select extract('isoyear' from date '2006-01-01');
 date_part
-----------
      2005
(1 )


devkuma=# select extract('isoyear' from current_timestamp);
 date_part
-----------
      2020
(1 )


devkuma=# select date_trunc('year', timestamp '2020-07-30 20:38:40');
     date_trunc
---------------------
 2020-01-01 00:00:00
(1 )


devkuma=# select date_trunc('year', current_timestamp);
       date_trunc
------------------------
 2020-01-01 00:00:00+09
(1 )

월을 추출하는 방법은 아래와 같다.

devkuma=# select date_part('month', timestamp '2020-07-30 20:38:40');
 date_part
-----------
         7
(1 )


devkuma=# select date_part('month', current_timestamp);
 date_part
-----------
        10
(1 )


devkuma=# select extract('month' from timestamp '2020-07-30 20:38:40');
 date_part
-----------
         7
(1 )


devkuma=# select extract('month' from interval '2 years 3 months');
 date_part
-----------
         3
(1 )


devkuma=# select extract('month' from interval '2 years 13 months');
 date_part
-----------
         1
(1 )


devkuma=# select date_trunc('month', timestamp '2020-07-30 20:38:40');
     date_trunc
---------------------
 2020-07-01 00:00:00
(1 )

날짜에서 일을 추출하는 방법은 아래와 같다.

devkuma=# select date_part('day', timestamp '2020-07-30 20:38:40');
 date_part
-----------
        30
(1 )


devkuma=# select date_trunc('day', timestamp '2020-07-30 20:38:40');
     date_trunc
---------------------
 2020-07-30 00:00:00
(1 )

시간에서 시를 추출하는 방법은 아래와 같다.

devkuma=# select date_part('hour', timestamp '2013-07-30 20:38:40');
 date_part
-----------
        20
(1 )


devkuma=# select date_part('hour', interval '4 hours 3 minutes');
 date_part
-----------
         4
(1 )


devkuma=# select date_trunc('hour', timestamp '2020-07-30 20:38:40');
     date_trunc
---------------------
 2020-07-30 20:00:00
(1 )

시간에서 분을 추출하는 방법은 아래와 같다.

devkuma=# select date_part('minute', timestamp '2020-07-30 20:38:40');
 date_part
-----------
        38
(1 )


devkuma=# select date_trunc('minute', timestamp '2020-07-30 20:38:40');
     date_trunc
---------------------
 2013-07-30 20:38:00
(1 )

시간에서 초를 추출하는 방법은 아래와 같다.

devkuma=# select date_part('second', timestamp '2013-07-30 20:38:40');
 date_part
-----------
        40
(1 )


devkuma=# select extract('second' from time '17:12:28.5');
 date_part
-----------
      28.5
(1 )


devkuma=# select date_trunc('second', timestamp '2013-07-30 20:38:40');
     date_trunc
---------------------
 2013-07-30 20:38:40
(1 )

세기(century) 추출를 추출하는 방법은 아래와 같다.

devkuma=# select extract('century' from timestamp '2000-12-16 12:21:13');
 date_part
-----------
        20
(1 )


devkuma=# select extract('century' from timestamp '2020-07-30 20:38:40');
 date_part
-----------
        21
(1 )


devkuma=# select date_trunc('century', timestamp '2020-07-30 20:38:40');
     date_trunc
---------------------
 2001-01-01 00:00:00
(1 )

요일/일차 추출를 추출하는 방법은 아래와 같다.

devkuma=# select extract('isodow' from timestamp '2013-07-30 20:38:40');   -- 일요일(0), 토요일(6)
 date_part
-----------
         2
(1 )


devkuma=# select extract('doy' from timestamp '2013-07-30 20:38:40'); -- 월요일(1), 일요일(7)
 date_part
-----------
       211
(1 )


devkuma=# select extract('doy' from timestamp '2020-07-30 20:38:40');
 date_part
-----------
       212
(1 )