速度
Date データ型は、ほとんどの 条件で DateTime より高速です。
Date 型に必要なストレージは 2 バイトですが、DateTime では 4 バイト必要です。ただし、圧縮時には Date と DateTime のサイズ差はさらに大きくなります。これは、DateTime に含まれる分や秒が圧縮されにくいためです。また、DateTime ではなく Date に対してフィルタリングや集計を行うほうが高速です。
使用上の注意
DateTime 型の値がテキスト形式でどのように表示されるか、および文字列として指定された値 ('2020-01-01 05:00:01') がどのように解析されるかに影響します。
タイムゾーン に依存しない Unix timestamp が table に保存され、タイムゾーン は、データのインポート/エクスポート時にそれをテキスト形式に変換したり、その逆変換を行ったり、値に対してカレンダー計算を行ったりするために使用されます (例: toDate、toHour 関数など) 。タイムゾーン は table の行 (または resultset) には保存されず、カラムのメタデータに保存されます。
サポートされている time zones の一覧は、IANA Time Zone Database で確認でき、SELECT * FROM system.time_zones で問い合わせることもできます。その一覧 は Wikipedia でも参照できます。
table の作成時に、DateTime 型のカラムに対して明示的に タイムゾーン を設定できます。例: DateTime('UTC')。タイムゾーン が設定されていない場合、ClickHouse は server settings の timezone parameter の値、または ClickHouse server の起動時点における operating system の設定を使用します。
clickhouse-client は、データ型の初期化時に タイムゾーン が明示的に設定されていない場合、デフォルトで server の タイムゾーン を適用します。client の タイムゾーン を使用するには、clickhouse-client を --use_client_time_zone parameter 付きで実行します。
ClickHouse は、date_time_output_format setting の値に応じて値を出力します。デフォルトのテキスト形式は YYYY-MM-DD hh:mm:ss です。さらに、formatDateTime 関数で出力形式を変更できます。
ClickHouse にデータを insert する際は、date_time_input_format setting の値に応じて、さまざまな日付と時刻の文字列形式を使用できます。
例
DateTime 型のカラムを持つテーブルを作成し、データを挿入する例:
- 整数として datetime を insert すると、Unix timestamp (UTC) として扱われます。
1546300800は UTC の'2019-01-01 00:00:00'を表します。ただし、timestampカラムにはAsia/Istanbul(UTC+3) のタイムゾーンが指定されているため、文字列として出力すると、値は'2019-01-01 03:00:00'と表示されます。 - 文字列の値を datetime として insert すると、そのカラムのタイムゾーンの時刻として扱われます。
'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 の1時間は2回現れます (1回は BST、もう1回は GMT) 。
- ClickHouse は常に最初の時刻 (BST) を選択するため、時間のインターバルを加算すると予期しない結果になることがあります。
- 2023年3月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 に戻します。