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개 행)