DATETIMECONVERT

DATETIMECONVERT

DATETIMECONVERT 함수는 타임스탬프를 포함한 컬럼의 값을 다른 시간 단위로 변환하고, 주어진 시간 세밀도에 따라 버킷화하는 함수예요.

출처: 문서

본문

타임스탬프를 포함한 컬럼의 값을 다른 시간 단위로 변환하고, 주어진 시간 세밀도에 따라 버킷화해요.

시그니처 (Signature)

DATETIMECONVERT(columnName, inputFormat, outputFormat, outputGranularity, bucketTimeZone)

inputFormat과 outputFormat은 다음 구조로 정의돼요:

<time size>:<time unit>:<time format>:<pattern>

여기서:

  • time size - 시간 단위의 크기 (예: 1, 10)
  • time unit - DAYS, HOURS, MINUTES, SECONDS, MILLISECONDS, MICROSECONDS, NANOSECONDS
  • time format
    • EPOCH
    • SIMPLE_DATE_FORMAT 패턴 - SIMPLE_DATE_FORMAT인 경우 정의돼요 (예: yyyy-MM-dd). tz(timezone)을 사용해 특정 시간대를 전달할 수 있어요. 시간대는 길거나 짧은 문자열 형식일 수 있어요. (예: Asia/Kolkata 또는 PDT)

granularity는 <time size>:<time unit> 형식으로 지정돼요.

bucketTimeZone - (선택 사항) 버킷화할 때 사용되는 시간대로, 예: 'PST' 또는 'Europe/London' 또는 '+00:00'. 이 매개변수를 설정하면 입력과 출력이 에포크 타임스탬프인 경우에도 세밀도 단위보다 한 단계 큰 시간 단위(예: 일 단위 세밀도면 월)에 상대적으로 버킷화가 수행돼요.

예를 들어, 2024-09-20T00:13:27.834Z의 에포크 밀리초를 5시간으로 버킷화하면 다음과 같아요:

  • 시간대 없음 -> 2024-09-19T20:00:00.000Z
  • 명시적 UTC 시간대 -> 2024-09-20T00:00:00.000Z

마찬가지로 날짜의 에포크 밀리초를 5일로 버킷화하면 다음과 같아요:

  • 시간대 없음 -> 2024-02-19T00:00:00.000Z
  • 명시적 UTC 시간대 -> 2024-09-16T00:00:00.000Z

사용 예시 (Usage Examples)

다음 예시는 Batch JSON Quick Start를 기반으로 해요.

created_at_timestamp를 에포크 이후 밀리초에서 에포크 이후 일로 변환하고, 1일 세밀도로 버킷화:

select id, 
       created_at_timestamp, 
       cast(created_at_timestamp AS long) AS timeInMs,
       DATETIMECONVERT(
         created_at_timestamp, 
         '1:MILLISECONDS:EPOCH', 
         '1:DAYS:EPOCH', 
         '1:DAYS'
       ) AS convertedTime
from githubEvents
WHERE id = 7044874134
id created_at_timestamp timeInMs convertedTime
7044874134 2018-01-01 11:00:00.0 1514804402000 17532

created_at_timestamp를 시간대 없이 1일 세밀도로 버킷화:

select id, 
       created_at_timestamp, 
       cast(created_at_timestamp AS long) AS timeInMs,
       DATETIMECONVERT(
         created_at_timestamp, 
         '1:MILLISECONDS:EPOCH', 
         '1:MILLISECONDS:EPOCH', 
         '1:DAYS'
       ) AS convertedTime
from githubEvents
WHERE id = 7044874134
id created_at_timestamp timeInMs convertedTime
7044874134 2018-01-01 12:00:02.0 1514804402000 1514764800000

created_at_timestamp를 Europe/Berlin 시간대를 사용해 1일 세밀도로 버킷화:

select id, 
       created_at_timestamp, 
       cast(created_at_timestamp AS long) AS timeInMs,
       DATETIMECONVERT(
         created_at_timestamp, 
         '1:MILLISECONDS:EPOCH', 
         '1:MILLISECONDS:EPOCH', 
         '1:DAYS',
         'Europe/Berlin'
       ) AS convertedTime
from githubEvents
WHERE id = 7044874134
id created_at_timestamp timeInMs convertedTime
7044874134 2018-01-01 12:00:02.0 1514804402000 1514761200000

created_at_timestamp를 15분 세밀도로 버킷화:

select id, 
       created_at_timestamp, 
       cast(created_at_timestamp AS long) AS timeInMs,
       DATETIMECONVERT(
         created_at_timestamp, 
         '1:MILLISECONDS:EPOCH', 
         '1:MILLISECONDS:EPOCH', 
         '15:MINUTES'
       ) AS convertedTime
from githubEvents
WHERE id = 7044874134
id created_at_timestamp timeInMs convertedTime
7044874134 2018-01-01 11:00:00.0 1514804402000 1514804400000

created_at_timestamp를 yyyy-MM-dd 형식으로 변환하고 1일 세밀도로 버킷화:

select id, 
       created_at_timestamp, 
       cast(created_at_timestamp AS long) AS timeInMs,
       DATETIMECONVERT(
         created_at_timestamp, 
         '1:MILLISECONDS:EPOCH', 
         '1:DAYS:SIMPLE_DATE_FORMAT:yyyy-MM-dd', 
         '1:DAYS'
       ) AS convertedTime
from githubEvents
WHERE id = 7044874134
id created_at_timestamp timeInMs convertedTime
7044874134 2018-01-01 11:00:00.0 1514804402000 2018-01-01

created_at_timestamp를 Pacific/Kiritimati 시간대에서 yyyy-MM-dd HH:mm 형식으로 변환:

select id, 
       created_at_timestamp, 
       cast(created_at_timestamp AS long) AS timeInMs,
       DATETIMECONVERT(
         created_at_timestamp, 
         '1:MILLISECONDS:EPOCH', 
         '1:MILLISECONDS:SIMPLE_DATE_FORMAT:yyyy-MM-dd HH:mm tz(Pacific/Kiritimati)', 
         '1:MILLISECONDS'
       ) AS convertedTime
from githubEvents
WHERE id = 7044874134
id created_at_timestamp timeInMs convertedTime
7044874134 2018-01-01 11:00:00.0 1514804402000 2018-01-02 01:00

created_at_timestamp를 Pacific/Kiritimati 시간대에서 yyyy-MM-dd 형식으로 변환하고 1일 세밀도로 버킷화:

select id, 
       created_at_timestamp, 
       cast(created_at_timestamp AS long) AS timeInMs,
       DATETIMECONVERT(
         created_at_timestamp, 
         '1:MILLISECONDS:EPOCH', 
         '1:MILLISECONDS:SIMPLE_DATE_FORMAT:yyyy-MM-dd HH:mm tz(Pacific/Kiritimati)', 
         '1:DAYS'
       ) AS convertedTime
from githubEvents
WHERE id = 7044874134
id created_at_timestamp timeInMs convertedTime
7044874134 2018-01-01 11:00:00.0 1514804402000 2018-01-02 00:00

created_at_timestamp를 UTC(기본값) 시간대에서 yyyy-MM-dd 형식으로 변환하고 1일 세밀도로 버킷화:

select id, 
       created_at_timestamp, 
       cast(created_at_timestamp AS long) AS timeInMs,
       DATETIMECONVERT(
         created_at_timestamp, 
         '1:MILLISECONDS:EPOCH', 
         '1:MILLISECONDS:SIMPLE_DATE_FORMAT:yyyy-MM-dd HH:mm', 
         '1:DAYS',
         'Europe/Berlin'
       ) AS convertedTime
from githubEvents
WHERE id = 7044874134
id created_at_timestamp timeInMs convertedTime
7044874134 2018-01-01 12:00:02.0 1514804402000 2017-12-31 23:00

더 알아보기 (Learn more)