# 型変換関数
# 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進数の表現はサポートされていません。先頭のゼロは削除されます。
返される値
Int8
、Int16
、Int32
、Int64
、Int128
、またはInt256
データ型の整数値。- 関数はゼロに向かって丸めるため、数値の小数部を切り捨てます。
- NaNやInfの引数に対する関数の動作は未定義です。関数を使用する際には、数値変換の問題に注意してください。
例
SELECT toInt32(32), toInt16('16'), toInt8(8.8);
┌─toInt32(32)─┬─toInt16('16')─┬─toInt8(8.8)─┐
│ 32 │ 16 │ 8 │
└─────────────┴───────────────┴─────────────┘
# toUInt
入力値をUIntデータ型に変換します。この関数ファミリには以下のものがあります:
toUInt8(expr)
—UInt8
データ型の値に変換します。toUInt16(expr)
—UInt16
データ型の値に変換します。toUInt32(expr)
—UInt32
データ型の値に変換します。toUInt64(expr)
—UInt64
データ型の値に変換します。toUInt256(expr)
—UInt256
データ型の値に変換します。
引数
expr
— 数値または数値の10進表現を持つ文字列を返す式。2進数、8進数、16進数の表現はサポートされていません。先頭のゼロは削除されます。
返される値
UInt8
、UInt16
、UInt32
、UInt64
、またはUInt256
データ型の整数値。- 関数はゼロに向かって丸めるため、数値の小数部を切り捨てます。
- 負の引数やNaN、Infの引数に対する関数の動作は未定義です。たとえば、負の数値を含む文字列
'-32'
を渡すと、ClickHouseは例外を発生させます。関数を使用する際には、数値変換の問題に注意してください。
例
SELECT toUInt32(32), toUInt16('16'), toUInt8(8.8);
┌─toUInt32(32)─┬─toUInt16('16')─┬─toUInt8(8.8)─┐
│ 32 │ 16 │ 8 │
└──────────────┴────────────────┴──────────────┘
# 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)─┐
│ 16 │ 8.8 │
└─────────────────┴────────────────┘
# toDate
引数をDateデータ型に変換します。引数がDateTimeまたはDateTime64の場合、トランケートされ、DateTimeの日付部分が残ります。
SELECT now() AS x, toDate(x)
┌───────────────────x─┬─toDate(now())─┐
│ 2022-12-30 13:44:17 │ 2022-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-30 │ Date │
└────────────┴───────────────────────────────────────────┘
SELECT toDate('2022-12-30') AS x, toTypeName(x)
┌──────────x─┬─toTypeName(toDate('2022-12-30'))─┐
│ 2022-12-30 │ Date │
└────────────┴──────────────────────────────────┘
- 引数が数値であり、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:58 │ 2022-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
value
をS
の精度を持つ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.11 │ Decimal(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 │
└───────────────────────────────────────────────────────────┘