# 날짜와 시간 다루기

## 날짜와 시간

날짜 시간 관련 함수를 다룰 때는 아래 두 가지 개념의 이해가 도움이 됩니다.

* `절대시간`과 `상대시간`
* `Timezone` 과 `Offset`

**절대시간**은 흐르는 시간의 축에서 한 점을 표현하고 이는 세계 어느 곳에서든 동일한 값을 가집니다. 즉, 살고 있는 지역과 무관하게 사용되는 시간입니다.

**상대시간**은 생활시간이라고도 하며 우리가 일상 생활에서 사용하는 시간을 의미합니다. 똑같은 아침 8시라고 하더라도 한국에서의 아침 8시와 런던에서의 아침 8시는 서로 다른 절대시간을 가집니다. 시차가 9시간이 나기 때문입니다.

<figure><img src="https://3847731534-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8HFmuPHf90mGhJC0APa2%2Fuploads%2Fgit-blob-d10be7c3b1091c0d1cc479b022fbcd6b80c6c099%2F%EB%82%A0%EC%A7%9C%EC%8B%9C%EA%B0%84%ED%95%A8%EC%88%98-%EC%A0%88%EB%8C%80%EC%8B%9C%EA%B0%84%EC%83%81%EB%8C%80%EC%8B%9C%EA%B0%84.png?alt=media" alt=""><figcaption><p>절대시간과 상대시간</p></figcaption></figure>

이렇듯 시간은 필요에 따라 다르게 표현될 수 있는데 빅쿼리에서는 다음의 5 가지 데이터 형식을 통해서 날짜와 시간을 나타낼 수 있습니다.

* `TIME`
* `DATE`
* `DATETIME`
* `TIMESTAMP`
* `INTERVAL`

`TIME`, `DATE` 그리고 이를 합친 `DATETIME` 형식은 상대시간을 표현할 때 사용합니다. 빅쿼리에서 `TIMESTAMP`는 절대시간을 의미합니다.

마지막으로 `INTERVAL`은 말 그대로 시간과 시간사이의 간격을 뜻합니다.

다음으로는 Timezone과 Offset에 대해서 살펴보겠습니다.

<figure><img src="https://3847731534-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8HFmuPHf90mGhJC0APa2%2Fuploads%2Fgit-blob-3aa03ac9d5e279a2c5bf7a74e6f90053bc60d0a7%2F%EB%82%A0%EC%A7%9C%EC%8B%9C%EA%B0%84%ED%95%A8%EC%88%98-TimezoneOffset.png?alt=media" alt=""><figcaption><p>Timezone vs Offset</p></figcaption></figure>

간단하게 설명하면 `Timezone`은 역사적으로 시간대의 변경이 동일하게 적용되었던 지역을 의미하며, `Offset`은 협정세계시(UTC)와 시간차이를 나타냅니다.

`Timezone`과 `Offset`은 혼용되어 쓰는 경우가 많으나 엄밀하게 둘은 다른 개념입니다. 예를 들어, 한국과 일본은 서로 다른 Timezone을 가지지만 현재 기준으로는 `+09:00`의 동일한 Offset를 가집니다.

또한, 동일한 `Timezone` 내에서도 일광절약시간제 등의 이유로 시기별로 다른 `Offset` 을 가지기도 합니다.

> Timezone 정보는 변환과정에서 보존될까 ?

오라클에는 `TIMESTAMP WITH TIME ZONE` 이라는 데이터 타입이 있습니다. 이 형식의 데이터는 시간에 대한 정보와 타임존에 대한 정보를 동시에 저장합니다.

반면에, 빅쿼리의 `TIMESTAMP`나 `DATETIME` 데이터 형식은 Timezone 정보를 저장하지 않습니다. 변환 과정에서 Timezone 을 지원하기는 하나 변환된 이후의 값에는 Timezone 정보가 보존되지 않습니다.

따라서, 상대시간을 절대시간으로 변환하거나 그 반대의 필요가 있을 경우 Timezone 정보를 별도의 컬럼으로 저장해야 합니다.

## 날짜 시간 함수 다루기

시간 정보를 다루는 과정은 다음과 같이 요약할 수 있습니다.

<figure><img src="https://3847731534-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8HFmuPHf90mGhJC0APa2%2Fuploads%2Fgit-blob-8d4989f6d1bd09ce4eddb09f1f5f8dcb209d7895%2F%EB%82%A0%EC%A7%9C%EC%8B%9C%EA%B0%84%ED%95%A8%EC%88%98-%EB%B3%80%ED%99%98%EC%A0%80%EC%9E%A5%ED%99%9C%EC%9A%A9.png?alt=media" alt=""><figcaption><p>Timezone vs Offset</p></figcaption></figure>

* 획득 및 변환
* 저장
* 활용

시간 정보는 운영계 RDBMS나 서버 로그 등에서 ETL 과정을 거쳐 BigQuery에 적재가 됩니다.

이 과정에서 이전에 문자열이나 다른 형식으로 표현된 시간 정보는 빅쿼리의 시간 날짜 형식으로 변환이 되어야 합니다. 변환 과정을 거친 후 빅쿼리에 테이블에 저장된 시간 정보는 이후 기간별 KPI 분석이나 시계열 분석 등을 위해 활용이 됩니다.
