カレンダーの日付と日の時間として表現できる瞬間を、定義されたサブセコンドの精度で保存することを許可します。
ティックサイズ(精度):10-precision 秒。有効範囲:[ 0 : 9 ]。一般的に使用されるのは、3(ミリ秒)、6(マイクロ秒)、9(ナノ秒)です。
構文:
DateTime64(precision, [timezone])
内部的には、1970-01-01 00:00:00 UTC からのティック数を Int64 として保存します。ティックの解像度は精度パラメータによって決まります。さらに、DateTime64
型は、列全体に対して同じタイムゾーンを保存でき、これにより DateTime64
型の値がテキスト形式でどのように表示されるか、文字列として指定された値がどのように解析されるか('2020-01-01 05:00:01.000')に影響します。タイムゾーンはテーブルの行(または結果セット)には保存されませんが、列のメタデータには保存されます。詳細は DateTime を参照してください。
サポートされている値の範囲:[1900-01-01 00:00:00, 2299-12-31 23:59:59.99999999]
注意:最大値の精度は8です。最大精度9桁(ナノ秒)が使用される場合、サポートされる最大値は 2262-04-11 23:47:16
UTC です。
DateTime64
型のカラムを持つテーブルを作成し、データを挿入する:
CREATE TABLE dt64
(
`timestamp` DateTime64(3, 'Asia/Istanbul'),
`event_id` UInt8
)
ENGINE = TinyLog;
-- DateTime を解析
-- - 1970-01-01 からの秒数として解釈された整数から。
-- - 文字列から、
INSERT INTO dt64 VALUES (1546300800123, 1), (1546300800.123, 2), ('2019-01-01 00:00:00', 3);
SELECT * FROM dt64;
┌───────────────timestamp─┬─event_id─┐
│ 2019-01-01 03:00:00.123 │ 1 │
│ 2019-01-01 03:00:00.123 │ 2 │
│ 2019-01-01 00:00:00.000 │ 3 │
└─────────────────────────┴──────────┘
- 整数として日時を挿入する際には、適切にスケーリングされたUnix タイムスタンプ(UTC)として扱われます。
1546300800000
(精度3)は '2019-01-01 00:00:00'
UTC を表します。しかし、timestamp
カラムは Asia/Istanbul
(UTC+3)のタイムゾーンを指定しているため、文字列として出力される際には値は '2019-01-01 03:00:00'
と表示されます。小数点を持つ日時を挿入する際は、整数と同様に扱われますが、小数点前の値が秒まで含むUnix タイムスタンプとなり、小数点以下は精度として扱われます。
- 文字列値を日時として挿入する際には、カラムのタイムゾーンであるとみなされます。
'2019-01-01 00:00:00'
は Asia/Istanbul
タイムゾーンにあるとみなされ、1546290000000
として保存されます。
DateTime64
値に対するフィルタリング
SELECT * FROM dt64 WHERE timestamp = toDateTime64('2019-01-01 00:00:00', 3, 'Asia/Istanbul');
┌───────────────timestamp─┬─event_id─┐
│ 2019-01-01 00:00:00.000 │ 3 │
└─────────────────────────┴──────────┘
DateTime
とは異なり、DateTime64
値は自動的に String
から変換されることはありません。
SELECT * FROM dt64 WHERE timestamp = toDateTime64(1546300800.123, 3);
┌───────────────timestamp─┬─event_id─┐
│ 2019-01-01 03:00:00.123 │ 1 │
│ 2019-01-01 03:00:00.123 │ 2 │
└─────────────────────────┴──────────┘
挿入とは逆に、toDateTime64
関数はすべての値を小数点の変種として扱うため、精度は小数点以下で指定する必要があります。
DateTime64
型の値のタイムゾーンを取得する:
SELECT toDateTime64(now(), 3, 'Asia/Istanbul') AS column, toTypeName(column) AS x;
┌──────────────────column─┬─x──────────────────────────────┐
│ 2023-06-05 00:09:52.000 │ DateTime64(3, 'Asia/Istanbul') │
└─────────────────────────┴────────────────────────────────┘
- タイムゾーンの変換
SELECT
toDateTime64(timestamp, 3, 'Europe/London') as lon_time,
toDateTime64(timestamp, 3, 'Asia/Istanbul') as istanbul_time
FROM dt64;
┌────────────────lon_time─┬───────────istanbul_time─┐
│ 2019-01-01 00:00:00.123 │ 2019-01-01 03:00:00.123 │
│ 2019-01-01 00:00:00.123 │ 2019-01-01 03:00:00.123 │
│ 2018-12-31 21:00:00.000 │ 2019-01-01 00:00:00.000 │
└─────────────────────────┴─────────────────────────┘
参照