속도
Date 데이터 타입은 DateTime보다 더 빠릅니다.
Date 데이터 타입은 저장 공간으로 2바이트가 필요하지만 DateTime은 4바이트가 필요합니다. 하지만 압축 시에는 Date와 DateTime의 크기 차이가 더 크게 벌어집니다. 이는 DateTime의 분과 초는 압축 효율이 낮기 때문입니다. 또한 DateTime 대신 Date에 필터링과 집계를 수행하는 것도 더 빠릅니다.
사용 시 유의사항
DateTime 타입 값이 텍스트 포맷으로 표시되는 방식과 문자열로 지정된 값(‘2020-01-01 05:00:01’)이 파싱되는 방식에 영향을 줍니다.
시간대와 무관한 Unix timestamp가 테이블에 저장되며, 시간대는 데이터 가져오기/내보내기 시 이를 텍스트 포맷으로 변환하거나 다시 되돌리는 데 사용됩니다. 또한 값에 대해 달력 계산을 수행할 때도 사용됩니다(예: toDate, toHour 함수 등). 시간대는 테이블의 행(또는 결과 집합)에는 저장되지 않지만, 컬럼 메타데이터에는 저장됩니다.
지원되는 시간대 목록은 IANA Time Zone Database에서 확인할 수 있으며, SELECT * FROM system.time_zones로도 조회할 수 있습니다. 이 목록은 Wikipedia에서도 제공됩니다.
테이블을 생성할 때 DateTime 타입 컬럼에 시간대를 명시적으로 설정할 수 있습니다. 예시: DateTime('UTC'). 시간대가 설정되지 않으면 ClickHouse는 서버 설정의 timezone 매개변수 값 또는 ClickHouse 서버가 시작될 당시의 운영 체제 설정을 사용합니다.
clickhouse-client는 데이터 타입을 초기화할 때 시간대가 명시적으로 설정되지 않으면 기본적으로 서버 시간대를 적용합니다. 클라이언트 시간대를 사용하려면 --use_client_time_zone 매개변수와 함께 clickhouse-client를 실행하세요.
ClickHouse는 date_time_output_format 설정 값에 따라 값을 출력합니다. 기본 텍스트 포맷은 YYYY-MM-DD hh:mm:ss입니다. 또한 formatDateTime 함수를 사용해 출력 형식을 변경할 수 있습니다.
ClickHouse에 데이터를 삽입할 때는 date_time_input_format 설정 값에 따라 다양한 날짜 및 시간 문자열 포맷을 사용할 수 있습니다.
예시
DateTime 타입의 컬럼이 있는 테이블을 생성하고 데이터를 삽입하는 예시:
- datetime를 정수로 삽입하면 Unix Timestamp(UTC)로 처리됩니다.
1546300800은 UTC 기준'2019-01-01 00:00:00'을 나타냅니다. 하지만timestamp컬럼에Asia/Istanbul(UTC+3) 시간대가 지정되어 있으므로, 문자열로 출력하면 값이'2019-01-01 03:00:00'으로 표시됩니다. - 문자열 값을 datetime로 삽입하면 컬럼의 시간대로 처리됩니다.
'2019-01-01 00:00:00'은Asia/Istanbul시간대로 간주되어1546290000으로 저장됩니다.
DateTime 값 필터링
DateTime 컬럼 값은 WHERE 프레디케이트에서 문자열 값으로 필터링할 수 있습니다. 이 값은 자동으로 DateTime으로 변환됩니다:
DateTime 타입 컬럼의 시간대 확인하기:
시간대 지원의 제한 사항
일광 절약 시간제(DST) 처리
date_time_output_format이simple로 설정된 경우- 시계가 뒤로 이동(“Fall Back”)하여 1시간이 겹치는 경우
- 시계가 앞으로 이동(“Spring Forward”)하여 1시간의 공백이 생기는 경우
- 2023년 10월 29일 02:00:00에 시계가 01:00:00으로 뒤로 이동합니다(BST → GMT).
- 01:00:00 – 01:59:59 구간이 두 번 나타납니다(BST에서 한 번, GMT에서 한 번).
- ClickHouse는 항상 첫 번째 시점(BST)을 선택하므로, 시간 인터벌을 추가할 때 예상치 못한 결과가 발생할 수 있습니다.
- 2023년 03월 26일
00:59:59에 시계가 02:00:00으로 앞당겨집니다(GMT → BST). 01:00:00–01:59:59시간대는 존재하지 않습니다.
2023-03-26 01:30:00을 2023-03-26 00:30:00으로 앞당깁니다.