타임스탬프 함수
타임스탬프 함수
이 섹션은 TIMESTAMP 값을 검사하고 조작하기 위한 함수와 연산자를 설명해요. 관련된 TIMESTAMPTZ 함수도 함께 참고하면 좋아요. 시간 데이터를 다룰 때 자주 쓰는 함수들이니 하나씩 살펴볼게요.
출처: 문서
본문
타임스탬프 연산자
아래 표는 TIMESTAMP 타입에 사용할 수 있는 수학 연산자를 보여줘요.
| 연산자 | 설명 | 예시 | 결과 |
|---|---|---|---|
+ |
INTERVAL 더하기 |
TIMESTAMP '1992-03-22 01:02:03' + INTERVAL 5 DAY |
1992-03-27 01:02:03 |
- |
TIMESTAMP 빼기 |
TIMESTAMP '1992-03-27' - TIMESTAMP '1992-03-22' |
5 days |
- |
INTERVAL 빼기 |
TIMESTAMP '1992-03-27 01:02:03' - INTERVAL 5 DAY |
1992-03-22 01:02:03 |
무한 값에 더하거나 빼면 같은 무한 값이 생성돼요.
스칼라 타임스탬프 함수
아래 표는 TIMESTAMP 값에 사용할 수 있는 스칼라 함수를 보여줘요.
| 이름 | 설명 |
|---|---|
age(timestamp, timestamp) |
인자들을 빼서 두 타임스탬프 사이의 시간 차이를 구함. |
age(timestamp) |
current_date에서 뺌. |
ago(interval) |
현재 타임스탬프에서 인터벌을 뺌. |
century(timestamp) |
타임스탬프의 세기 추출. |
current_localtimestamp() |
현재 타임스탬프 반환 (트랜잭션 시작 시점). |
date_diff(part, starttimestamp, endtimestamp) |
starttimestamp와 endtimestamp 사이의 part 경계 수. 더 큰 타임스탬프는 포함하고 더 작은 것은 제외. |
date_part([part, ...], timestamp) |
나열된 subfield들을 struct로 가져오기. 목록은 상수여야 함. |
date_part(part, timestamp) |
subfield 가져오기 (extract와 동등). |
date_sub(part, starttimestamp, endtimestamp) |
starttimestamp와 endtimestamp 사이 간격의 부호 있는 길이. part의 정수 배수로 잘림. |
date_trunc(part, timestamp) |
지정된 정밀도로 잘라내기. |
dayname(timestamp) |
요일의 (영어) 이름. |
epoch_ms(timestamp) |
epoch 이후의 총 밀리초 수 반환. |
epoch_ns(timestamp) |
epoch 이후의 총 나노초 수 반환. |
epoch_us(timestamp) |
epoch 이후의 총 마이크로초 수 반환. |
epoch(timestamp) |
epoch 이후의 총 초 수 반환. |
extract(field FROM timestamp) |
타임스탬프에서 subfield 가져오기. |
greatest(timestamp, timestamp) |
두 타임스탬프 중 더 늦은 것. |
isfinite(timestamp) |
타임스탬프가 유한하면 true, 그렇지 않으면 false 반환. |
isinf(timestamp) |
타임스탬프가 무한하면 true, 그렇지 않으면 false 반환. |
julian(timestamp) |
타임스탬프에서 Julian Day 수 추출. |
last_day(timestamp) |
한 달의 마지막 날. |
least(timestamp, timestamp) |
두 타임스탬프 중 더 이른 것. |
make_timestamp(bigint, bigint, bigint, bigint, bigint, double) |
주어진 부분들에 대한 타임스탬프. |
make_timestamp(microseconds) |
epoch 이후의 마이크로초를 타임스탬프로 변환. |
make_timestamp_ms(milliseconds) |
epoch 이후의 밀리초를 타임스탬프로 변환. |
make_timestamp_ns(nanoseconds) |
epoch 이후의 나노초를 타임스탬프로 변환. |
monthname(timestamp) |
월의 (영어) 이름. |
strftime(timestamp, format) |
포맷 문자열에 따라 타임스탬프를 문자열로 변환. |
strptime(text, format-list) |
목록의 포맷 문자열을 하나가 성공할 때까지 적용해 문자열 text를 타임스탬프로 변환. 실패 시 오류 던짐. 실패 시 NULL을 반환하려면 try_strptime 사용. |
strptime(text, format) |
포맷 문자열에 따라 문자열 text를 타임스탬프로 변환. 실패 시 오류 던짐. 실패 시 NULL을 반환하려면 try_strptime 사용. |
time_bucket(bucket_width, timestamp[, offset]) |
timestamp를 폭 bucket_width의 격자로 잘라냄. 격자는 bucket_width가 개월 수 또는 그보다 거친 단위일 때 2000-01-01 00:00:00[ + offset]에, 그 외에는 2000-01-03 00:00:00[ + offset]에 고정됨. 2000-01-03이 월요일이라는 점 유의. |
time_bucket(bucket_width, timestamp[, origin]) |
timestamp를 폭 bucket_width의 격자로 잘라냄. 격자는 origin 타임스탬프에 고정되며, 기본값은 bucket_width가 개월 수 또는 그보다 거친 단위일 때 2000-01-01 00:00:00, 그 외에는 2000-01-03 00:00:00. 2000-01-03이 월요일이라는 점 유의. |
try_strptime(text, format-list) |
목록의 포맷 문자열을 하나가 성공할 때까지 적용해 문자열 text를 타임스탬프로 변환. 실패 시 NULL 반환. |
try_strptime(text, format) |
포맷 문자열에 따라 문자열 text를 타임스탬프로 변환. 실패 시 NULL 반환. |
subfield를 얻기 위한 전용 추출 함수도 있어요.
무한 날짜에 적용된 함수는 "말이 되는" 것에 따라 같은 무한 날짜(예: greatest)를 반환하거나 NULL(예: date_part)을 반환해요. 일반적으로 함수가 무한 날짜의 부분을 검사해야 하면 결과는 NULL이에요.
age(timestamp, timestamp)
| 설명 | 인자들을 빼서 두 타임스탬프 사이의 시간 차이를 구함 |
| 예시 | age(TIMESTAMP '2001-04-10', TIMESTAMP '1992-09-20') |
| 결과 | 8 years 6 months 20 days |
age(timestamp)
| 설명 | current_date에서 뺌 |
| 예시 | age(TIMESTAMP '1992-09-20') |
| 결과 | 29 years 1 month 27 days 12:39:00.844 |
ago(interval)
| 설명 | 현재 타임스탬프에서 인터벌을 빼 과거의 타임스탬프를 반환. current_timestamp - interval과 동등 |
| 예시 | ago(INTERVAL 1 HOUR) |
| 결과 | 2024-11-30 12:28:48.895 (현재 시간이 2024-11-30 13:28:48.895일 때) |
century(timestamp)
| 설명 | 타임스탬프의 세기 추출 |
| 예시 | century(TIMESTAMP '1992-03-22') |
| 결과 | 20 |
current_localtimestamp()
| 설명 | 현재 타임스탬프 반환 (트랜잭션 시작 시점) |
| 예시 | current_localtimestamp() |
| 결과 | 2024-11-30 13:28:48.895 |
date_diff(part, starttimestamp, endtimestamp)
| 설명 | starttimestamp와 endtimestamp 사이의 부호 있는 part 경계 수. 더 큰 타임스탬프는 포함하고 더 작은 것은 제외 |
| 예시 | date_diff('hour', TIMESTAMP '1992-09-30 23:59:59', TIMESTAMP '1992-10-01 01:58:00') |
| 결과 | 2 |
date_part([part, ...], timestamp)
| 설명 | 나열된 subfield들을 struct로 가져오기. 목록은 상수여야 함 |
| 예시 | date_part(['year', 'month', 'day'], TIMESTAMP '1992-09-20 20:38:40') |
| 결과 | {year: 1992, month: 9, day: 20} |
date_part(part, timestamp)
| 설명 | subfield 가져오기 (extract와 동등) |
| 예시 | date_part('minute', TIMESTAMP '1992-09-20 20:38:40') |
| 결과 | 38 |
date_sub(part, starttimestamp, endtimestamp)
| 설명 | starttimestamp와 endtimestamp 사이 간격의 부호 있는 길이. part의 정수 배수로 잘림 |
| 예시 | date_sub('hour', TIMESTAMP '1992-09-30 23:59:59', TIMESTAMP '1992-10-01 01:58:00') |
| 결과 | 1 |
date_trunc(part, timestamp)
| 설명 | 지정된 정밀도로 잘라내기 |
| 예시 | date_trunc('hour', TIMESTAMP '1992-09-20 20:38:40') |
| 결과 | 1992-09-20 20:00:00 |
dayname(timestamp)
| 설명 | 요일의 (영어) 이름 |
| 예시 | dayname(TIMESTAMP '1992-03-22') |
| 결과 | Sunday |
epoch_ms(timestamp)
| 설명 | epoch 이후의 총 밀리초 수 반환 |
| 예시 | epoch_ms(TIMESTAMP '2021-08-03 11:59:44.123456') |
| 결과 | 1627991984123 |
epoch_ns(timestamp)
| 설명 | epoch 이후의 총 나노초 수 반환 |
| 예시 | epoch_ns(TIMESTAMP '2021-08-03 11:59:44.123456') |
| 결과 | 1627991984123456000 |
epoch_us(timestamp)
| 설명 | epoch 이후의 총 마이크로초 수 반환 |
| 예시 | epoch_us(TIMESTAMP '2021-08-03 11:59:44.123456') |
| 결과 | 1627991984123456 |
epoch(timestamp)
| 설명 | epoch 이후의 총 초 수 반환 |
| 예시 | epoch('2022-11-07 08:43:04'::TIMESTAMP) |
| 결과 | 1667810584.0 |
BIGINT를 반환하는epoch_ms,epoch_us,epoch_ns와 달리epoch는DOUBLE을 반환하므로 초 이하 정밀도를 유지해요.
extract(field FROM timestamp)
| 설명 | 타임스탬프에서 subfield 가져오기 |
| 예시 | extract('hour' FROM TIMESTAMP '1992-09-20 20:38:48') |
| 결과 | 20 |
greatest(timestamp, timestamp)
| 설명 | 두 타임스탬프 중 더 늦은 것 |
| 예시 | greatest(TIMESTAMP '1992-09-20 20:38:48', TIMESTAMP '1992-03-22 01:02:03.1234') |
| 결과 | 1992-09-20 20:38:48 |
isfinite(timestamp)
| 설명 | 타임스탬프가 유한하면 true, 그렇지 않으면 false 반환 |
| 예시 | isfinite(TIMESTAMP '1992-03-07') |
| 결과 | true |
isinf(timestamp)
| 설명 | 타임스탬프가 무한하면 true, 그렇지 않으면 false 반환 |
| 예시 | isinf(TIMESTAMP '-infinity') |
| 결과 | true |
julian(timestamp)
| 설명 | 타임스탬프에서 Julian Day 수 추출 |
| 예시 | julian(TIMESTAMP '1992-03-22 01:02:03.1234') |
| 결과 | 2448704.043091706 |
last_day(timestamp)
| 설명 | 한 달의 마지막 날 |
| 예시 | last_day(TIMESTAMP '1992-03-22 01:02:03.1234') |
| 결과 | 1992-03-31 |
least(timestamp, timestamp)
| 설명 | 두 타임스탬프 중 더 이른 것 |
| 예시 | least(TIMESTAMP '1992-09-20 20:38:48', TIMESTAMP '1992-03-22 01:02:03.1234') |
| 결과 | 1992-03-22 01:02:03.1234 |
make_timestamp(bigint, bigint, bigint, bigint, bigint, double)
| 설명 | 주어진 부분들에 대한 타임스탬프 |
| 예시 | make_timestamp(1992, 9, 20, 13, 34, 27.123456) |
| 결과 | 1992-09-20 13:34:27.123456 |
make_timestamp(microseconds)
| 설명 | epoch 이후의 마이크로초를 타임스탬프로 변환 |
| 예시 | make_timestamp(1667810584123456) |
| 결과 | 2022-11-07 08:43:04.123456 |
make_timestamp_ms(milliseconds)
| 설명 | epoch 이후의 밀리초를 타임스탬프로 변환 |
| 예시 | make_timestamp_ms(1667810584123) |
| 결과 | 2022-11-07 08:43:04.123 |
make_timestamp_ns(nanoseconds)
| 설명 | epoch 이후의 나노초를 타임스탬프로 변환 |
| 예시 | make_timestamp_ns(1667810584123456789) |
| 결과 | 2022-11-07 08:43:04.123456789 |
monthname(timestamp)
| 설명 | 월의 (영어) 이름 |
| 예시 | monthname(TIMESTAMP '1992-09-20') |
| 결과 | September |
strftime(timestamp, format)
| 설명 | 포맷 문자열에 따라 타임스탬프를 문자열로 변환 |
| 예시 | strftime(timestamp '1992-01-01 20:38:40', '%a, %-d %B %Y - %I:%M:%S %p') |
| 결과 | Wed, 1 January 1992 - 08:38:40 PM |
strptime(text, format-list)
| 설명 | 목록의 포맷 문자열을 하나가 성공할 때까지 적용해 문자열 text를 타임스탬프로 변환. 실패 시 오류 던짐. 실패 시 NULL을 반환하려면 try_strptime 사용 |
| 예시 | strptime('4/15/2023 10:56:00', ['%d/%m/%Y %H:%M:%S', '%m/%d/%Y %H:%M:%S']) |
| 결과 | 2023-04-15 10:56:00 |
strptime(text, format)
| 설명 | 포맷 문자열에 따라 문자열 text를 타임스탬프로 변환. 실패 시 오류 던짐. 실패 시 NULL을 반환하려면 try_strptime 사용 |
| 예시 | strptime('Wed, 1 January 1992 - 08:38:40 PM', '%a, %-d %B %Y - %I:%M:%S %p') |
| 결과 | 1992-01-01 20:38:40 |
time_bucket(bucket_width, timestamp[, offset])
| 설명 | timestamp를 폭 bucket_width의 격자로 잘라냄. 격자는 bucket_width가 개월 수 또는 그보다 거친 단위일 때 2000-01-01 00:00:00[ + offset], 그 외에는 2000-01-03 00:00:00[ + offset] 포함. 2000-01-03이 월요일이라는 점 유의 |
| 예시 | time_bucket(INTERVAL '10 minutes', TIMESTAMP '1992-04-20 15:26:00-07', INTERVAL '5 minutes') |
| 결과 | 1992-04-20 15:25:00 |
time_bucket(bucket_width, timestamp[, origin])
| 설명 | timestamp를 폭 bucket_width의 격자로 잘라냄. 격자는 origin 타임스탬프를 포함하며, 기본값은 bucket_width가 개월 수 또는 그보다 거친 단위일 때 2000-01-01 00:00:00, 그 외에는 2000-01-03 00:00:00. 2000-01-03이 월요일이라는 점 유의 |
| 예시 | time_bucket(INTERVAL '2 weeks', TIMESTAMP '1992-04-20 15:26:00', TIMESTAMP '1992-04-01 00:00:00') |
| 결과 | 1992-04-15 00:00:00 |
try_strptime(text, format-list)
| 설명 | 목록의 포맷 문자열을 하나가 성공할 때까지 적용해 문자열 text를 타임스탬프로 변환. 실패 시 NULL 반환 |
| 예시 | try_strptime('4/15/2023 10:56:00', ['%d/%m/%Y %H:%M:%S', '%m/%d/%Y %H:%M:%S']) |
| 결과 | 2023-04-15 10:56:00 |
try_strptime(text, format)
| 설명 | 포맷 문자열에 따라 문자열 text를 타임스탬프로 변환. 실패 시 NULL 반환 |
| 예시 | try_strptime('Wed, 1 January 1992 - 08:38:40 PM', '%a, %-d %B %Y - %I:%M:%S %p') |
| 결과 | 1992-01-01 20:38:40 |
타임스탬프 테이블 함수
아래 표는 TIMESTAMP 타입에 사용할 수 있는 테이블 함수를 보여줘요.
| 이름 | 설명 |
|---|---|
generate_series(timestamp, timestamp, interval) |
닫힌 범위에서 인터벌만큼씩 증가하는 타임스탬프 테이블 생성. |
range(timestamp, timestamp, interval) |
반 개방 범위에서 인터벌만큼씩 증가하는 타임스탬프 테이블 생성. |
무한 값은 테이블 함수 경계로 허용되지 않아요.
generate_series(timestamp, timestamp, interval)
| 설명 | 닫힌 범위에서 인터벌만큼씩 증가하는 타임스탬프 테이블 생성 |
| 예시 | generate_series(TIMESTAMP '2001-04-10', TIMESTAMP '2001-04-11', INTERVAL 30 MINUTE) |
range(timestamp, timestamp, interval)
| 설명 | 반 개방 범위에서 인터벌만큼씩 증가하는 타임스탬프 테이블 생성 |
| 예시 | range(TIMESTAMP '2001-04-10', TIMESTAMP '2001-04-11', INTERVAL 30 MINUTE) |
더 알아보기 (Learn more)
TIMESTAMPTZ함수는sql/functions/timestamptz, date parts는sql/functions/datepart문서를 참고해 주세요.