メインコンテンツへスキップ
指定した秒未満の精度で、暦日と時刻で表せる時点を格納できます ティックサイズ (精度) : 10-精度 Seconds。有効範囲: [ 0 : 9 ]。 通常は 3 (ミリ秒) 、6 (マイクロ秒) 、9 (ナノ秒) が使用されます。 構文:
DateTime64(precision, [timezone])
内部的には、epoch の開始時点 (1970-01-01 00:00:00 UTC) からの ‘tick’ 数としてデータを Int64 で格納します。tick の resolution は 精度 パラメータによって決まります。さらに、DateTime64 型にはカラム全体で共通の タイムゾーン を格納できます。これは、DateTime64 型の値がテキストフォーマットでどのように表示されるか、および文字列として指定された値 (‘2020-01-01 05:00:01.000’) がどのように parse されるかに影響します。タイムゾーン は table の行 (または result set) には格納されず、カラムのメタデータに格納されます。詳細は DateTime を参照してください。 サポートされる値の範囲: [1900-01-01 00:00:00, 2299-12-31 23:59:59.999999999] 小数点以下の桁数は 精度 パラメータによって決まります。 注: 最大値の精度は 8 です。最大精度の 9 桁 (ナノ秒) を使用する場合、サポートされる最大値は UTC で 2262-04-11 23:47:16 です。

  1. DateTime64 型のカラムを持つテーブルを作成し、データを挿入する:
CREATE TABLE dt64
(
    `timestamp` DateTime64(3, 'Asia/Istanbul'),
    `event_id` UInt8
)
ENGINE = MergeTree;
-- DateTimeをパース
-- - 1970-01-01からのミリ秒数として解釈される整数(精度3のため)から、
-- - 小数点より前の部分を秒数、小数点以降を精度として解釈される小数から、
-- - 文字列から。

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 │
└─────────────────────────┴──────────┘
  • datetime を整数として insert すると、適切に scale された Unix Timestamp (UTC) として扱われます。1546300800000 (精度 3) は UTC の '2019-01-01 00:00:00' を表します。ただし、timestamp カラムには Asia/Istanbul (UTC+3) の timezone が指定されているため、文字列として出力すると、値は '2019-01-01 03:00:00' と表示されます。datetime を小数として insert する場合も、整数の場合と同様に扱われますが、小数点より前の値は秒までを含む Unix Timestamp として扱われ、小数点より後は 精度 として扱われます。
  • 文字列値を datetime として insert すると、カラムの timezone の時刻として扱われます。'2019-01-01 00:00:00'Asia/Istanbul timezone の時刻として解釈され、1546290000000 として保存されます。
  1. 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 │
└─────────────────────────┴──────────┘
insert とは異なり、toDateTime64 関数ではすべての値が Decimal のバリアントとして扱われるため、精度は 小数点の後に指定する必要があります。
  1. 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') │
└─────────────────────────┴────────────────────────────────┘
  1. タイムゾーン変換
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 │
└─────────────────────────┴─────────────────────────┘
関連項目
最終更新日 2026年6月10日