카테고리:

날짜 및 시간 함수

TIME_SLICE

조각의 길이가 표준 시간 단위(분, 시간, 일 등)의 배수인 시간 “조각”의 시작 또는 끝을 계산합니다.

이 함수는 데이터를 분류할 수 있는 고정 너비 “버킷”의 시작 및 종료 시간을 계산하는 데 사용할 수 있습니다.

참고 항목:

DATE_TRUNC

구문

TIME_SLICE( <date_or_time_expr> , <slice_length> , <date_or_time_part> [ , <start_or_end> ] )
Copy

인자

필수:

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’입니다.

반환

반환 값의 데이터 타입은 입력 date_or_time_expr 의 데이터 타입(즉, TIMESTAMP_NTZ 또는 DATE)과 동일합니다.

사용법 노트

  • 모든 조각은 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일에 시작할 수 있습니다.

    한 가지 예외는, 주 단위로 측정된 조각의 경우, 조각의 시작이 1970년 1월 1일을 포함하는 의 시작에 맞춰 정렬된다는 것입니다. 1970년 1월 1일은 목요일이었습니다. 예를 들어, WEEK_START 세션 매개 변수가 달력 주가 월요일에 시작하도록 지정하고 조각이 2주인 경우, 조각은 다음 경계 중 하나에서 시작됩니다.

    • 1969년 12월 29일(월요일).

    • 1970년 1월 12일(월요일).

    • 1970년 1월 25일(월요일).

    • 등.

    달력 주가 일요일에 시작하는 경우, 조각은 다음 날짜에 시작됩니다.

    • 1969년 12월 28일(일요일).

    • 1970년 1월 11일(일요일).

    • 1970년 1월 25일(일요일).

    • 등.

    달력 주를 처리하는 방법(예 포함)에 대한 자세한 내용은 달력상의 주 및 요일 을 참조하십시오.

  • TIME_SLICE에 대한 매개 변수는 DATE 또는 TIMESTAMP_NTZ 형식이어야 하지만, 캐스팅을 사용하여 TIMESTAMP_LTZ 값을 처리할 수 있습니다. TIMESTAMP_LTZ 값의 경우, 먼저 입력을 TIMESTAMP_NTZ로 캐스팅한 다음, TIMESTAMP_LTZ로 다시 캐스팅합니다. 그러나 이 경우, 일광 절약 시간제 경계를 가로지르는 조각은 일광 절약 시간제 경계를 가로지르지 않는 조각보다 1시간 더 길거나 1시간 더 짧을 수 있습니다.

  • 각 조각의 끝은 다음 조각의 시작과 동일합니다. 예를 들어, 조각이 2개월이고 조각의 시작이 2019-01-01이면 조각의 끝은 2019-02-28이 아니라 2019-03-01이 됩니다. 즉, 조각에는 시작보다 크거나 같고 끝보다 작은(그러나 같지는 않은) 날짜 또는 타임스탬프가 포함됩니다.

날짜가 포함된 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   |
+------------+----------------+--------------+
Copy

두 개의 타임스탬프에 해당하는 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 |
+-------------------------+-------------------------+-------------------------+-------------------------+
Copy

날짜 또는 타임스탬프를 기반으로 데이터를 “버킷”으로 그룹화합니다(예: 데이터를 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);
Copy

이 쿼리는 버킷 데이터를 보여줍니다.

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 |
+----------------+--------------+----------------------+-------------------+
Copy

컴파일러는 GROUP BY 절이 프로젝션 절의 모든 비집계 식을 포함할 것으로 예상하기 때문에 GROUP BY 절에는 조각의 시작과 조각의 끝이 모두 필요합니다.