타임스탬프 함수

타임스탬프 함수

이 섹션은 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) starttimestampendtimestamp 사이의 part 경계 수. 더 큰 타임스탬프는 포함하고 더 작은 것은 제외.
date_part([part, ...], timestamp) 나열된 subfield들을 struct로 가져오기. 목록은 상수여야 함.
date_part(part, timestamp) subfield 가져오기 (extract와 동등).
date_sub(part, starttimestamp, endtimestamp) starttimestampendtimestamp 사이 간격의 부호 있는 길이. 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)

| 설명 | starttimestampendtimestamp 사이의 부호 있는 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)

| 설명 | starttimestampendtimestamp 사이 간격의 부호 있는 길이. 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와 달리 epochDOUBLE을 반환하므로 초 이하 정밀도를 유지해요.

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 문서를 참고해 주세요.