TIME_SLICE
TIME_SLICE
TIME_SLICE는 시간 "조각(slice)"의 시작 또는 끝을 계산하는 날짜 & 시간 함수예요. 여기서 조각의 길이는 표준 시간 단위(분·시간·일 등)의 배수예요. 데이터를 범주화할 수 있는 고정 폭 "버킷(bucket)"의 시작·종료 시각을 계산할 때 사용해요.
본문
카테고리: 날짜 & 시간 함수
구문 (Syntax)
TIME_SLICE( <date_or_time_expr> , <slice_length> , <date_or_time_part> [ , <start_or_end> ] )
인자 (Arguments)
필수:
<date_or_time_expr> — 함수는 이 날짜 또는 시간을 포함하는 조각의 시작 또는 끝을 반환해요. 표현식은 DATE 또는 TIMESTAMP_NTZ 타입이어야 해요.
<slice_length> — 조각의 폭(즉 조각에 포함된 시간 단위 수)을 나타내요. 예를 들어 단위가 MONTH이고 slice_length가 2라면 각 조각의 폭은 2개월이에요. slice_length는 1 이상의 정수여야 해요.
<date_or_time_part> — 조각 길이의 시간 단위예요. 값은 아래 나열된 값 중 하나를 담은 문자열이어야 해요:
- 입력 표현식이 DATE면: YEAR, QUARTER, MONTH, WEEK, DAY.
- 입력 표현식이 TIMESTAMP_NTZ면: YEAR, QUARTER, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND.
값은 대소문자를 구분하지 않아요.
선택:
<start_or_end> — 조각의 시작 또는 끝 중 어느 것을 반환할지 결정하는 선택적 상수 파라미터예요. 지원되는 값은 'START' 또는 'END'예요. 값은 대소문자를 구분하지 않아요. 기본값은 'START'예요.
반환값 (Returns)
반환 값의 데이터 타입은 입력 date_or_time_expr의 데이터 타입과 동일해요(즉 TIMESTAMP_NTZ 또는 DATE).
사용 시 유의사항 (Usage notes)
- 모든 조각은 1970년 1월 1일 자정(1970-01-01 00:00:00)을 기준으로 정렬돼요.
- 대부분의 조각은 1970년 1월 1일을 기준으로 한 조각 길이의 정수 배수에서 시작해요. 예를 들어 조각 길이를 15년으로 선택하면 각 조각은 다음 경계 중 하나에서 시작해요: 1970년 1월 1일, 1985년 1월 1일, 2000년 1월 1일, 2015년 1월 1일 등. 1970년 1월 1일 이전 날짜도 유효해요. 예를 들어 15년 조각은 1955년 1월 1일에 시작할 수 있어요.
- 한 가지 예외는, 주(week) 단위로 측정한 조각의 시작이 1970년 1월 1일을 포함하는 주의 시작과 정렬된다는 거예요. 1970년 1월 1일은 목요일이었어요. 예를 들어 WEEK_START 세션 파라미터가 달력 주가 월요일에 시작하도록 지정하고 조각이 2주라면, 조각은 다음 경계 중 하나에서 시작해요: 1969년 12월 29일(월요일), 1970년 1월 12일(월요일), 1970년 1월 26일(월요일) 등. 달력 주가 일요일에 시작한다면 조각은 1969년 12월 28일(일요일), 1970년 1월 11일(일요일), 1970년 1월 25일(일요일) 등에서 시작해요. 달력 주 처리 방법의 자세한 내용(예시 포함)은 달력 주와 평일을 참고해요.
- TIME_SLICE의 파라미터는 DATE 또는 TIMESTAMP_NTZ 타입이어야 하지만, 캐스팅을 사용해 TIMESTAMP_LTZ 값을 처리할 수 있어요. TIMESTAMP_LTZ 값의 경우 입력을 먼저 TIMESTAMP_NTZ로 캐스팅한 뒤 다시 TIMESTAMP_LTZ로 캐스팅해요. 하지만 이 경우 일광 절약 시간(DST) 경계를 가로지르는 조각은 DST 경계를 가로지르지 않는 조각보다 1시간 길거나 짧을 수 있어요.
- 각 조각의 끝은 다음 조각의 시작과 같아요. 예를 들어 조각이 2개월이고 조각의 시작이 2019-01-01이라면 조각의 끝은 2019-02-28이 아니라 2019-03-01이에요. 즉 조각은 시작과 같거나 크고 끝보다 작은(같지 않은) 날짜 또는 타임스탬프를 포함해요.
예시 (Examples)
날짜를 포함하는 4개월 조각의 시작과 끝을 찾아요:
SELECT '2019-02-28'::DATE AS "DATE",
TIME_SLICE("DATE", 4, 'MONTH', 'START') AS "START OF SLICE",
TIME_SLICE("DATE", 4, 'MONTH', 'END') AS "END OF SLICE";
+------------+----------------+--------------+
| DATE | START OF SLICE | END OF SLICE |
|------------+----------------+--------------|
| 2019-02-28 | 2019-01-01 | 2019-05-01 |
+------------+----------------+--------------+
두 타임스탬프에 해당하는 8시간 조각의 시작을 찾아요:
SELECT '2019-02-28T01:23:45.678'::TIMESTAMP_NTZ AS "TIMESTAMP 1",
'2019-02-28T12:34:56.789'::TIMESTAMP_NTZ AS "TIMESTAMP 2",
TIME_SLICE("TIMESTAMP 1", 8, 'HOUR') AS "SLICE FOR TIMESTAMP 1",
TIME_SLICE("TIMESTAMP 2", 8, 'HOUR') AS "SLICE FOR TIMESTAMP 2";
+-------------------------+-------------------------+-------------------------+-------------------------+
| TIMESTAMP 1 | TIMESTAMP 2 | SLICE FOR TIMESTAMP 1 | SLICE FOR TIMESTAMP 2 |
|-------------------------+-------------------------+-------------------------+-------------------------|
| 2019-02-28 01:23:45.678 | 2019-02-28 12:34:56.789 | 2019-02-28 00:00:00.000 | 2019-02-28 08:00:00.000 |
+-------------------------+-------------------------+-------------------------+-------------------------+
데이터를 날짜 또는 타임스탬프를 기준으로 "버킷"으로 그룹화해요(예: 2주 폭의 버킷으로 데이터 그룹화):
이 예시는 아래에서 만든 테이블과 데이터를 사용해요:
CREATE TABLE accounts (ID INT, billing_date DATE, balance_due NUMBER(11, 2));
INSERT INTO accounts (ID, billing_date, balance_due) VALUES
(1, '2018-07-31', 100.00),
(2, '2018-08-01', 200.00),
(3, '2018-08-25', 400.00);
이 쿼리는 버킷된 데이터를 보여줘요:
SELECT
TIME_SLICE(billing_date, 2, 'WEEK', 'START') AS "START OF SLICE",
TIME_SLICE(billing_date, 2, 'WEEK', 'END') AS "END OF SLICE",
COUNT(*) AS "NUMBER OF LATE BILLS",
SUM(balance_due) AS "SUM OF MONEY OWED"
FROM accounts
WHERE balance_due > 0 -- bill hasn't yet been paid
GROUP BY "START OF SLICE", "END OF SLICE";
+----------------+--------------+----------------------+-------------------+
| START OF SLICE | END OF SLICE | NUMBER OF LATE BILLS | SUM OF MONEY OWED |
|----------------+--------------+----------------------+-------------------|
| 2018-07-23 | 2018-08-06 | 2 | 300.00 |
| 2018-08-20 | 2018-09-03 | 1 | 400.00 |
+----------------+--------------+----------------------+-------------------+
컴파일러는 GROUP BY 절에 프로젝션 절의 모든 비집계(non-aggregate) 표현식이 포함되기를 기대하므로, GROUP BY 절에는 조각 시작과 조각 끝이 모두 필요하다는 점을 유의해요.