メインコンテンツへスキップ
メインコンテンツへスキップ

DateTime64

カレンダー日付と一日の時刻で表現できる時点を、サブ秒精度を指定して保存できるデータ型です。

ティックサイズ(精度)は 10-precision 秒です。指定可能な範囲: [ 0 : 9 ]。
通常は 3(ミリ秒)、6(マイクロ秒)、9(ナノ秒)が使用されます。

構文:

DateTime64(精度, [タイムゾーン])

内部的には、エポック開始(1970-01-01 00:00:00 UTC)からの「ティック」数としてデータを Int64 で格納します。ティックの分解能は precision パラメータによって決まります。さらに、DateTime64 型では列全体で共通のタイムゾーンを保持でき、このタイムゾーンが DateTime64 型の値のテキスト形式での表示方法や、文字列として指定された値('2020-01-01 05:00:01.000')のパース方法に影響します。タイムゾーンはテーブルの行(または結果セット)には保存されず、列メタデータとして保存されます。詳細は DateTime を参照してください。

サポートされる値の範囲: [1900-01-01 00:00:00, 2299-12-31 23:59:59.999999999]

小数点以下の桁数は precision パラメータに依存します。

注記: 最大値に対する precision は 8 です。最大の 9 桁(ナノ秒)の precision を使用する場合、UTC におけるサポートされる最大値は 2262-04-11 23:47:16 です。

  1. DateTime64 型の列を持つテーブルを作成し、データを挿入する:
CREATE TABLE dt64
(
    `timestamp` DateTime64(3, 'Asia/Istanbul'),
    `event_id` UInt8
)
ENGINE = TinyLog;
-- DateTime を解析する
-- - 整数値を(精度 3 のため)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 │
└─────────────────────────┴──────────┘
  • datetime を整数として挿入する場合、それは適切にスケーリングされた Unix タイムスタンプ (UTC) として扱われます。精度 3 の 1546300800000 は UTC の '2019-01-01 00:00:00' を表します。ただし、timestamp 列にはタイムゾーンとして Asia/Istanbul (UTC+3) が指定されているため、文字列として出力すると、値は '2019-01-01 03:00:00' と表示されます。datetime を小数として挿入する場合も整数と同様に扱われますが、小数点より前の値は秒までを含む Unix タイムスタンプであり、小数点より後ろの値は精度として扱われます。
  • 文字列値を datetime として挿入する場合、それは当該列のタイムゾーンの時刻として解釈されます。'2019-01-01 00:00:00'Asia/Istanbul タイムゾーンの時刻として扱われ、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 │
└─────────────────────────┴──────────┘

挿入する場合とは異なり、toDateTime64 関数はすべての値を小数形式として扱うため、小数点以下の精度を指定する必要があります。

  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;
┌────────────────ロンドン_time─┬───────────イスタンブール_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 │
└─────────────────────────┴─────────────────────────┘

関連項目