# 型変換関数

# toInt

入力値をIntデータ型の値に変換します。この関数ファミリには以下のものがあります:

  • toInt8(expr)Int8データ型の値に変換します。
  • toInt16(expr)Int16データ型の値に変換します。
  • toInt32(expr)Int32データ型の値に変換します。
  • toInt64(expr)Int64データ型の値に変換します。
  • toInt128(expr)Int128データ型の値に変換します。
  • toInt256(expr)Int256データ型の値に変換します。

引数

  • expr — 数値または数値の10進表現を持つ文字列を返す式。2進数、8進数、16進数の表現はサポートされていません。先頭のゼロは削除されます。

返される値

  • Int8Int16Int32Int64Int128、またはInt256データ型の整数値。
  • 関数はゼロに向かって丸めるため、数値の小数部を切り捨てます。
  • NaNやInfの引数に対する関数の動作は未定義です。関数を使用する際には、数値変換の問題に注意してください。

SELECT toInt32(32), toInt16('16'), toInt8(8.8);
┌─toInt32(32)─┬─toInt16('16')─┬─toInt8(8.8)─┐
│          32168 │
└─────────────┴───────────────┴─────────────┘

# toUInt

入力値をUIntデータ型に変換します。この関数ファミリには以下のものがあります:

  • toUInt8(expr)UInt8データ型の値に変換します。
  • toUInt16(expr)UInt16データ型の値に変換します。
  • toUInt32(expr)UInt32データ型の値に変換します。
  • toUInt64(expr)UInt64データ型の値に変換します。
  • toUInt256(expr)UInt256データ型の値に変換します。

引数

  • expr — 数値または数値の10進表現を持つ文字列を返す式。2進数、8進数、16進数の表現はサポートされていません。先頭のゼロは削除されます。

返される値

  • UInt8UInt16UInt32UInt64、またはUInt256データ型の整数値。
  • 関数はゼロに向かって丸めるため、数値の小数部を切り捨てます。
  • 負の引数やNaN、Infの引数に対する関数の動作は未定義です。たとえば、負の数値を含む文字列'-32'を渡すと、ClickHouseは例外を発生させます。関数を使用する際には、数値変換の問題に注意してください。

SELECT toUInt32(32), toUInt16('16'), toUInt8(8.8);
┌─toUInt32(32)─┬─toUInt16('16')─┬─toUInt8(8.8)─┐
│           32168 │
└──────────────┴────────────────┴──────────────┘

# toFloat

入力値をFloatデータ型に変換します。この関数ファミリには以下のものがあります:

  • toFloat32(expr)Float32データ型の値に変換します。
  • toFloat64(expr)Float64データ型の値に変換します。

引数

  • expr — 数値または数値の10進表現を持つ文字列を返す式。2進数、8進数、16進数の表現はサポートされていません。先頭のゼロは削除されます。

返される値

  • Float32またはFloat64データ型の浮動小数点数値。
  • 関数はゼロに向かって丸めるため、数値の小数部を切り捨てます。
  • NaNやInfの引数に対する関数の動作は未定義です。関数を使用する際には、数値変換の問題に注意してください。

SELECT toFloat32('16'), toFloat64(8.8);
┌─toFloat32('16')─┬─toFloat64(8.8)─┐
│              168.8 │
└─────────────────┴────────────────┘

# toDate

引数をDateデータ型に変換します。引数がDateTimeまたはDateTime64の場合、トランケートされ、DateTimeの日付部分が残ります。

SELECT now() AS x, toDate(x)
┌───────────────────x─┬─toDate(now())─┐
│ 2022-12-30 13:44:172022-12-30    │
└─────────────────────┴───────────────┘

  • 引数が文字列の場合、DateまたはDateTimeとして解析されます。DateTimeとして解析された場合、日付部分が使用されます。
SELECT toDate('2022-12-30 01:02:03') AS x, toTypeName(x)
┌──────────x─┬─toTypeName(toDate('2022-12-30 01:02:03'))─┐
│ 2022-12-30Date                                      │
└────────────┴───────────────────────────────────────────┘
SELECT toDate('2022-12-30') AS x, toTypeName(x)
┌──────────x─┬─toTypeName(toDate('2022-12-30'))─┐
│ 2022-12-30Date                             │
└────────────┴──────────────────────────────────┘
  • 引数が数値であり、UNIXタイムスタンプのように見える場合(65535以上の場合)、DateTimeとして解釈され、現在のタイムゾーンでDateに切り捨てられます。タイムゾーンは関数の第2引数として指定できます。Dateへの切り捨てはタイムゾーンに依存します。
SELECT now() AS current_time, 
       toUnixTimestamp(current_time) AS ts, 
       toDateTime(ts) AS time_Amsterdam, 
       toDateTime(ts, 'Pacific/Apia') AS time_Samoa, 
       toDate(time_Amsterdam) AS date_Amsterdam, 
       toDate(time_Samoa) AS date_Samoa, 
       toDate(ts) AS date_Amsterdam_2, 
       toDate(ts, 'Pacific/Apia') AS date_Samoa_2 FORMAT Vertical;
Row 1:
──────
current_time:     2023-11-14 10:37:49
ts:               1699929469
time_Amsterdam:   2023-11-14 10:37:49
time_Samoa:       2023-11-14 15:37:49
date_Amsterdam:   2023-11-14
date_Samoa:       2023-11-14
date_Amsterdam_2: 2023-11-14
date_Samoa_2:     2023-11-14

上記の例は、同じUNIXタイムスタンプが異なるタイムゾーンで異なる日付として解釈される方法を示しています。

  • 引数が数値であり、65536未満の場合、1970-01-01(最初のUNIX日)からの日数として解釈され、Dateに変換されます。これはDateデータ型の内部数値表現に対応しています。例:
SELECT toDate(12345)
┌─toDate(12345)─┐
│ 2003-10-20    │
└───────────────┘

この変換はタイムゾーンに依存しません。

  • 引数がDate型の範囲に収まらない場合、実装定義の動作になります。最大サポートされる日付に飽和するかオーバーフローする可能性があります。
SELECT toDate(10000000000.)
┌─toDate(10000000000.)─┐
│ 2106-02-07           │
└──────────────────────┘
  • toDate関数は、以下のような代替形式でも書くことができます。
SELECT now() AS time, toDate(time)
┌──────────time───────┬─────toDate(now()───┐
│ 2022-12-30 13:54:582022-12-30         │
└─────────────────────┴────────────────────┘

# toDateTime64

引数をDateTime64データ型に変換します。

toDateTime64(expr, scale, [timezone])

引数

  • expr — 値。文字列、UInt32、Float、またはDateTimeです。
  • scale - ティックサイズ(精度):10秒。有効範囲:[ 0 : 9 ]。
    • 精度
  • timezone - 指定したdatetime64オブジェクトのタイムゾーン。

返される値

  • サブ秒の精度を持つカレンダーの日付と時刻。
  • 型:DateTime64。

  • 値が範囲内の場合:
SELECT toDateTime64('1955-01-01 00:00:00.000', 3) AS value, 
       toTypeName(value);
┌───────────────────value─┬─toTypeName(toDateTime64('1955-01-01 00:00:00.000', 3)) ─┐
│ 1955-01-01 00:00:00.000 │ DateTime64(3)                                           │
└─────────────────────────┴─────────────────────────────────────────────────────────┘
  • 精度を持つ10進数として:
SELECT toDateTime64(1546300800.000, 3) AS value, 
       toTypeName(value);
┌───────────────────value─┬─toTypeName(toDateTime64(1546300800., 3)) ─┐
│ 2019-01-01 00:00:00.000 │ DateTime64(3)                             │
└─────────────────────────┴───────────────────────────────────────────┘
  • 小数点なしの値は、依然として秒単位のUNIXタイムスタンプとして扱われます:
SELECT toDateTime64(1546300800000, 3) AS value, 
       toTypeName(value);
┌───────────────────value─┬─toTypeName(toDateTime64(1546300800000, 3))─┐
│ 2299-12-31 23:59:59.000 │ DateTime64(3)                              │
└─────────────────────────┴────────────────────────────────────────────┘
  • timezoneを指定した場合:
SELECT toDateTime64('2019-01-01 00:00:00', 3, 'Asia/Istanbul') AS value, 
       toTypeName(value);
┌───────────────────value─┬─toTypeName(toDateTime64('2019-01-01 00:00:00', 3, 'Asia/Istanbul'))─┐
│ 2019-01-01 00:00:00.000 │ DateTime64(3, 'Asia/Istanbul')                                      │
└─────────────────────────┴─────────────────────────────────────────────────────────────────────┘

# toDecimal

valueSの精度を持つDecimal (opens new window)データ型に変換します。valueは数値または文字列であることができます。S(スケール)パラメータは小数点以下の桁数を指定します。

  • toDecimal32(value, S)
  • toDecimal64(value, S)
  • toDecimal128(value, S)
  • toDecimal256(value, S)

引数

  • expr — 式。Stringデータ型で値を返します。ClickHouseは、10進数の数値のテキスト表現を期待します。たとえば、'1.111'です。
  • S — スケール。結果の値の小数点以下の桁数を指定します。

返される値

  • (Decimal(P,S))データ型の値。値には以下が含まれます:
  • ClickHouseが入力文字列を数値として解釈する場合、S桁の小数部を持つ数値。

SELECT toDecimal32(toString(1.111), 2) AS val, toTypeName(val);
┌──val─┬─toTypeName(toDecimal32(toString(1.111), 2))─┐
│ 1.11Decimal(9, 2)                               │
└──────┴─────────────────────────────────────────────┘

# toString

数値、文字列(ただし固定文字列ではない)、日付、日付と時刻の間で変換するための関数。これらの関数はすべて1つの引数を受け入れます。

  • 文字列への変換または文字列からの変換では、値はTabSeparated形式(およびほとんどの他のテキスト形式)と同じルールでフォーマットまたは解析されます。文字列を解析できない場合、例外がスローされ、リクエストがキャンセルされます。
  • 日付から数値またはその逆への変換では、日付はUnixエポックの開始からの日数に対応します。日付と時刻から数値またはその逆への変換では、日付と時刻はUnixエポックの開始からの秒数に対応します。
  • toDate/toDateTime関数の日付と日付-時刻の形式は次のように定義されます:
    • YYYY-MM-DDYYYY-MM-DD hh:mm:ss
  • 例外として、UInt32、Int32、UInt64、またはInt64の数値型からDateに変換する場合、数値が65536以上である場合、数値はUnixタイムスタンプ(日数ではなく)として解釈され、日付に丸められます。これにより、一般的なtoDate(unix_timestamp)の書き方をサポートすることができます。それ以外の場合、エラーになり、より煩雑なtoDate(toDateTime(unix_timestamp))を書く必要があります。
  • 日付と日付-時刻の間の変換は、自然な方法で行われます:nullの時間を追加するか、時間を削除することによって。

SELECT now() AS ts, 
       time_zone, 
       toString(ts) AS str_tz_datetime
FROM system.time_zones
WHERE time_zone LIKE 'Europe%'LIMIT 10
┌──────────────────ts─┬─time_zone─────────┬─str_tz_datetime─────┐
│ 2023-11-14 10:42:16 │ Europe/Amsterdam  │ 2023-11-14 10:42:16 │
│ 2023-11-14 10:42:16 │ Europe/Andorra    │ 2023-11-14 10:42:16 │
│ 2023-11-14 10:42:16 │ Europe/Astrakhan  │ 2023-11-14 10:42:16 │
│ 2023-11-14 10:42:16 │ Europe/Athens     │ 2023-11-14 10:42:16 │
│ 2023-11-14 10:42:16 │ Europe/Belfast    │ 2023-11-14 10:42:16 │
│ 2023-11-14 10:42:16 │ Europe/Belgrade   │ 2023-11-14 10:42:16 │
│ 2023-11-14 10:42:16 │ Europe/Berlin     │ 2023-11-14 10:42:16 │
│ 2023-11-14 10:42:16 │ Europe/Bratislava │ 2023-11-14 10:42:16 │
│ 2023-11-14 10:42:16 │ Europe/Brussels   │ 2023-11-14 10:42:16 │
│ 2023-11-14 10:42:16 │ Europe/Bucharest  │ 2023-11-14 10:42:16 │
└─────────────────────┴───────────────────┴─────────────────────┘

# parseDateTime()

MySQLのフォーマット文字列に従って、文字列をDateTimeに変換します。この関数は、関数formatDateTimeの逆の操作です。

parseDateTime(str, format[, timezone])

引数

  • str — 解析する文字列
  • format — フォーマット文字列
  • timezone — タイムゾーン。オプション。

返される値

  • MySQLスタイルのフォーマット文字列に従って入力文字列から解析されたDateTime値。

サポートされるフォーマット指定子

  • formatDateTimeにリストされているすべてのフォーマット指定子(%Qを除く)。

SELECT parseDateTime('2021-01-04+23:00:00', '%Y-%m-%d+%H:%i:%s')
┌─parseDateTime('2021-01-04+23:00:00', '%Y-%m-%d+%H:%i:%s')─┐
│                                       2021-01-04 23:00:00 │
└───────────────────────────────────────────────────────────┘
Last Updated: Fri Nov 01 2024 09:02:06 GMT+0000