将输入值转换为指定的数据类型。与重新解释函数不同,CAST
尝试使用新数据类型呈现相同的值。如果无法完成转换,则会引发异常。
语法
CAST(x, T) CAST(x AS t)
参数
x
— 要转换的值。可以是任何类型。T
— 目标数据类型的名称。字符串。t
— 目标数据类型。返回值
说明
!!! note “注意”
如果输入值不符合目标类型的范围,结果将溢出。例如,CAST(-1, 'UInt8')
返回255
。
示例
SELECT CAST(toInt8(-1), 'UInt8') AS cast_int_to_uint, CAST(1.5 AS Decimal(3,2)) AS cast_float_to_decimal;
┌─cast_int_to_uint─┬─cast_float_to_decimal─┐ │ 255 │ 1.50 │ └──────────────────┴───────────────────────┘
SELECT'2016-06-15 23:00:00' AS timestamp,CAST(timestamp AS DateTime) AS datetime,CAST(timestamp AS Date) AS date,CAST(timestamp, 'String') AS string,CAST(timestamp, 'FixedString(22)') AS fixed_string;
┌─timestamp───────────┬─datetime────────────┬─date───────┬─string──────────────┬─fixed_string────────┐ │ 2016-06-15 23:00:00 │ 2016-06-15 23:00:00 │ 2016-06-15 │ 2016-06-15 23:00:00 │ 2016-06-15 23:00:00 │ └─────────────────────┴─────────────────────┴────────────┴─────────────────────┴─────────────────────┘
转换为 FixedString(N) 仅适用于 String 或 FixedString 类型的参数。
支持类型转换为 Nullable 以及转回。
SELECT toTypeName(number) FROM numbers(2);
┌─toTypeName(number)─┐ │ UInt64 │ │ UInt64 │ └────────────────────┘
SELECT toTypeName(CAST(number, 'Nullable(UInt64)')) FROM numbers(2);
┌─toTypeName(CAST(number, 'Nullable(UInt64)'))─┐ │ Nullable(UInt64) │ │ Nullable(UInt64) │ └──────────────────────────────────────────────┘
这些函数接受一个字符串,并将字符串开头的字节解释为主机顺序(小端)的数字。如果字符串不够长,这些函数的工作方式就像用必要数量的空字节填充字符串一样。如果字符串比需要的长,则忽略多余的字节。日期被解释为自 Unix 纪元开始以来的天数。
语法
reinterpretAsDate(fixed_string)
参数
fixed_string
— 用字节表示的字符串。返回值
示例
SELECT reinterpretAsDate(reinterpretAsString(toDate('2019-01-01')));
┌─reinterpretAsDate(reinterpretAsString(toDate('2019-01-01')))─┐ │ 2019-01-01 │ └──────────────────────────────────────────────────────────────┘
这些函数接受一个字符串,并将字符串开头的字节解释为主机顺序(小端)的数字。如果字符串不够长,这些函数的工作方式就像用必要数量的空字节填充字符串一样。如果字符串比需要的长,则忽略多余的字节。日期被解释为自 Unix 纪元开始以来的天数,带时间的日期被解释为自 Unix 纪元开始以来的秒数。
语法
reinterpretAsDateTime(fixed_string)
参数
fixed_string
— 用字节表示的字符串。返回值
示例
SELECT reinterpretAsDateTime(reinterpretAsString(toDateTime('2019-01-01 00:00:00')));
┌─reinterpretAsDateTime(reinterpretAsString(toDateTime('2019-01-01 00:00:00')))─┐ │ 2019-01-01 00:00:00 │ └───────────────────────────────────────────────────────────────────────────────┘
此函数接受数字或日期或带时间的日期,并返回包含表示主机顺序(小端)相应值的字节的 FixedString。空字节将从末尾删除。例如,UInt32 类型值为 255 是一个字节长的 FixedString。
语法
reinterpretAsFixedString(x)
参数
x
— 数字、日期或带有时间的日期。返回值
示例
SELECT reinterpretAsFixedString(toDate('2019-01-01'));
┌─reinterpretAsFixedString(toDate('2019-01-01'))─┐ │ �E │ └────────────────────────────────────────────────┘
此函数接受数字或日期或带时间的日期,并返回一个字符串,其中包含表示主机顺序(小端)中相应值的字节。空字节从末尾删除。例如,UInt32 类型值 255 是一个长度为 1 个字节的字符串。
语法
reinterpretAsString(value)
参数
value
— 数字、日期或带时间的日期返回值
示例
SELECT reinterpretAsString(toDate('2019-01-01'));
┌─reinterpretAsString(toDate('2019-01-01'))─┐ │ �E │ └───────────────────────────────────────────┘
将字符串、日期、日期时间、UInt* 数字转换为日期类型
。toDate
语法
toDate(time)
参数
time
— 字符串、日期、日期时间、UInt* 数字。返回值
示例
SELECT toDate('2019-01-01');
┌─cast_int_to_uint─┬─cast_float_to_decimal─┐ │ 255 │ 1.50 │ └──────────────────┴───────────────────────┘
SELECT toDate(1);
┌─toDate(1)──┐ │ 1970-01-02 │ └────────────┘
SELECT toDate(toDateTime('2019-01-01 00:00:00'));
┌─toDate(toDateTime('2019-01-01 00:00:00'))─┐ │ 2019-01-01 │ └───────────────────────────────────────────┘
转换value
为精度为 的 Decimal 数据类型S
。value
可以是数字或字符串。S
(scale) 参数指定小数位数。
语法
toDecimal32(value, S) toDecimal64(value, S)
参数
value
可以是数字或字符串S
(scale) 参数指定小数的位数。返回值
示例
SELECT toDecimal32(1, 2)
┌─toDecimal32(1, 2)─┐ │ 1.00 │ └───────────────────┘
SELECT toDecimal32('1', 2)
┌─toDecimal32('1', 2)─┐ │ 1.00 │ └─────────────────────┘
将输入字符串转换为 Nullable(Decimal(P,S)) 数据类型值。toDecimal*()
如果您希望NULL
在输入值解析错误时获取值而不是异常,则应该使用这些函数来代替函数。
语法
toDecimal32OrNull(expr, S) toDecimal64OrNull(expr, S)
参数
expr
— 表达式,返回字符串数据类型的值。ByteHouse 需要十进制数的文本表示形式。例如,'1.111'
。S
— 小数位数,结果值的小数位数。返回值
数据类型 的值Nullable(Decimal(P,S))
。该值包含:
S
如果 ByteHouse 将输入字符串解释为数字,则为带有小数的数字。NULL
如果 ByteHouse 无法将输入的字符串解释为数字,或者输入的数字包含超过S
小数位。示例
SELECT toDecimal32OrNull(toString(-1.111), 5) AS val, toTypeName(val);
┌─val──────┬─toTypeName(toDecimal32OrNull(toString(-1.111), 5))─┐ │ -1.11100 │ Nullable(Decimal(9, 5)) │ └──────────┴────────────────────────────────────────────────────┘
SELECT toDecimal32OrNull(toString(-1.111), 2) AS val, toTypeName(val); sql
┌─val──┬─toTypeName(toDecimal32OrNull(toString(-1.111), 2))─┐ │ ᴺᵁᴸᴸ │ Nullable(Decimal(9, 2)) │ └──────┴────────────────────────────────────────────────────┘
将输入值转换为 Decimal(P,S) 数据类型。toDecimal*()
如果您希望0
在输入值解析错误时获取值而不是异常,则应该使用这些函数来代替函数。
语法
toDecimal32OrZero( expr, S) toDecimal64OrZero( expr, S)
参数
expr
— 表达式数据类型。ByteHouse 需要十进制数的文本表示。例如,'1.111'
。S
— 小数位数,结果值的小数位数。返回值
数据类型 的值Nullable(Decimal(P,S))
。该值包含:
S
如果 ClickHouse 将输入字符串解释为数字,则为带有小数的数字。S
如果 ClickHouse 无法将输入字符串解释为数字,或者输入的数字包含超过S
小数位,则返回带有小数位的 0 。示例
SELECT toDecimal32OrZero(toString(-1.111), 5) AS val, toTypeName(val);
┌─val──────┬─toTypeName(toDecimal32OrZero(toString(-1.111), 5))─┐ │ -1.11100 │ Decimal(9, 5) │ └──────────┴────────────────────────────────────────────────────┘
SELECT toDecimal32OrZero(toString(-1.111), 2) AS val, toTypeName(val);
┌─val──┬─toTypeName(toDecimal32OrZero(toString(-1.111), 2))─┐ │ 0.00 │ Decimal(9, 2) │ └──────┴────────────────────────────────────────────────────┘
将 String 类型参数转换为 FixedString(N) 类型(固定长度为 N 的字符串)。N 必须是常量。
如果字符串的字节数少于 N,则在右侧填充空字节。如果字符串的字节数多于 N,则抛出异常。
语法
toFixedString(s, N)
参数
s
细绳。N
— 一个常数。返回值
示例
SELECT toFixedString('1234', 5)
┌─toFixedString('1234', 5)─┐ │ 1234 │ └──────────────────────────┘
将输入值转换为 Int 数据类型。
语法
toInt8(expr) toInt16(expr) toInt32(expr) toInt64(expr)
参数
expr
— 表达式返回一个数字或一个以十进制表示的数字字符串。不支持二进制、八进制和十六进制的数字表示。前导零被删除。返回值
Int8
、Int16
、Int32
、 Int64
的整数值。函数使用向零舍入,这意味着它们会截断数字的小数部分。
NaN 和 Inf 参数的函数行为未定义。
当您将值从一种数据类型转换为另一种数据类型时,您应该记住,在通常情况下,这是一种不安全的操作,可能会导致数据丢失。如果您尝试将值从较大的数据类型转换为较小的数据类型,或者在不同数据类型之间转换值,则可能会发生数据丢失。
示例
SELECT toInt64(nan), toInt32(32), toInt16('16'), toInt8(8.8);
┌─toInt64(nan)─────────┬─toInt32(32)─┬─toInt16('16')─┬─toInt8(8.8)─┐ │ -9223372036854775808 │ 32 │ 16 │ 8 │ └──────────────────────┴─────────────┴───────────────┴─────────────┘
它接受一个 String 类型的参数并尝试将其解析为 Int (8 | 16 | 32 | 64)。如果失败,则返回 NULL。
语法
toInt8OrNull(expr) toInt16OrNull(expr) toInt32OrNull(expr) toInt64OrNull(expr)
参数
expr
— 表达式返回一个数字或一个以十进制表示的数字字符串。不支持二进制、八进制和十六进制的数字表示。前导零被删除。返回值
Int8
、Int16
、Int32
、 Int64
的整数值。函数使用向零舍入,这意味着它们会截断数字的小数部分。
NaN 和 Inf 参数的函数行为未定义。
当您将值从一种数据类型转换为另一种数据类型时,您应该记住,在通常情况下,这是一种不安全的操作,可能会导致数据丢失。如果您尝试将值从较大的数据类型转换为较小的数据类型,或者在不同数据类型之间转换值,则可能会发生数据丢失。
示例
SELECT toInt64OrNull('123123'), toInt8OrNull('123qwe123');
┌─toInt64OrNull('123123')─┬─toInt8OrNull('123qwe123')─┐ │ 123123 │ ᴺᵁᴸᴸ │ └─────────────────────────┴───────────────────────────┘
它接受一个 String 类型的参数并尝试将其解析为 Int (8 | 16 | 32 | 64 )。如果失败,则返回 0。
语法
toInt8OrZero(expr) toInt16OrZero(expr) toInt32OrZero(expr) toInt64OrZero(expr)
参数
expr
— 表达式返回一个数字或一个以十进制表示的数字字符串。不支持二进制、八进制和十六进制的数字表示。前导零被删除。返回值
Int8
、Int16
、Int32
、 Int64
的整数值。函数使用向零舍入,这意味着它们会截断数字的小数部分。
NaN 和 Inf 参数的函数行为未定义。
当您将值从一种数据类型转换为另一种数据类型时,您应该记住,在通常情况下,这是一种不安全的操作,可能会导致数据丢失。如果您尝试将值从较大的数据类型转换为较小的数据类型,或者在不同数据类型之间转换值,则可能会发生数据丢失。
示例
SELECT toInt64OrZero('123123'), toInt8OrZero('123qwe123');
┌─toInt64OrZero('123123')─┬─toInt8OrZero('123qwe123')─┐ │ 123123 │ 0 │ └─────────────────────────┴───────────────────────────┘
将数字类型参数转换为间隔数据类型。
语法
toIntervalSecond(number) toIntervalMinute(number) toIntervalHour(number) toIntervalDay(number) toIntervalWeek(number) toIntervalMonth(number) toIntervalQuarter(number) toIntervalYear(number)
参数
number
— 间隔持续时间。正整数。返回值
Interval
数据类型的值。示例
WITH toDate('2019-01-01') AS date,INTERVAL 1 WEEK AS interval_week, toIntervalWeek(1) AS interval_to_week SELECT date + interval_week,date + interval_to_week;
┌─plus(date, interval_week)─┬─plus(date, interval_to_week)─┐ │ 2019-01-08 │ 2019-01-08 │ └───────────────────────────┴──────────────────────────────┘
将输入参数转换为相同数据类型的 LowCardianlity 版本。
要从LowCardinality
数据类型转换数据,请使用 CAST 函数。例如,CAST(x as String)
。
语法
toLowCardinality(expr)
参数
expr
— 表达式产生受支持的数据类型之一。返回值
expr
。类型:LowCardinality(expr_result_type)
示例
SELECT toLowCardinality('1');
┌─toLowCardinality('1')─┐ │ 1 │ └───────────────────────┘
用于在数字、字符串(但不是固定字符串)、日期和带时间的日期之间进行转换的函数。
所有这些函数都接受一个参数。
在转换为字符串或从字符串转换时,值的格式或解析规则与 TabSeparated 格式(以及几乎所有其他文本格式)相同。如果无法解析字符串,则会引发异常并取消请求。
当将日期转换为数字或反之亦然时,日期对应于自 Unix 纪元开始以来的天数。
当将带有时间的日期转换为数字或反之亦然时,带有时间的日期对应于自 Unix 纪元开始以来的秒数。
toDate/toDateTime 函数的日期和日期时间格式定义如下:
YYYY-MM-DD YYYY-MM-DD hh:mm:ss
例外情况是,如果从 UInt32、Int32、UInt64 或 Int64 数字类型转换为 Date,并且数字大于或等于 65536,则该数字将被解释为 Unix 时间戳(而不是天数)并四舍五入为日期。这允许支持常见的“toDate(unix_timestamp)”写入,否则将出现错误,并且需要写入更麻烦的“toDate(toDateTime(unix_timestamp))”。
日期和时间日期之间的转换以自然的方式进行:通过添加空时间或删除时间。
数字类型之间的转换使用与 C++ 中不同数字类型之间的赋值相同的规则。
此外,DateTime 参数的 toString 函数可以采用第二个 String 参数,其中包含时区名称。示例:Asia/Yekaterinburg
在这种情况下,时间根据指定的时区进行格式化。
语法
toString(value)
参数
value
— 数字、字符串、日期和日期时间返回值
示例
SELECT now() AS now_local, toString(now(), 'Asia/Yekaterinburg') AS now_yekat;
┌─now_local───────────┬─now_yekat───────────┐ │ 2021-08-18 15:25:59 │ 2021-08-18 12:25:59 │ └─────────────────────┴─────────────────────┘
接受字符串或 FixedString 参数。返回在找到的第一个零字节处截断内容的字符串。
语法
toStringCutToZero(s)
参数
s
— 字符串或固定字符串。返回值
示例
SELECT toFixedString('foo', 8) AS s, toStringCutToZero(s) AS s_cut;
┌─s───┬─s_cut─┐ │ foo │ foo │ └─────┴───────┘
SELECT toFixedString('foo\0bar', 8) AS s, toStringCutToZero(s) AS s_cut;
┌─s──────┬─s_cut─┐ │ foobar │ foo │ └────────┴───────┘
将输入值转换为 UInt 数据类型。此函数系列包括:
语法
toUInt8(expr) toUInt16(expr) toUInt32(expr) toUInt64(expr)
参数
expr
— 表达式返回一个数字或一个以十进制表示的数字字符串。不支持二进制、八进制和十六进制的数字表示。前导零被删除。返回值
Int8
、Int16
、Int32
、 Int64
的整数值。函数使用向零舍入,这意味着它们会截断数字的小数部分。
函数对于负数参数以及 NaN 和 Inf 参数的行为未定义。如果您传递带有负数的字符串(例如)'-32'
,ByteHouse 会引发异常。
当您将值从一种数据类型转换为另一种数据类型时,您应该记住,在通常情况下,这是一种不安全的操作,可能会导致数据丢失。如果您尝试将值从较大的数据类型转换为较小的数据类型,或者在不同数据类型之间转换值,则可能会发生数据丢失。
示例
SELECT toUInt64(nan), toUInt32(-32), toUInt16('16'), toUInt8(8.8);
┌─toUInt64(nan)───────┬─toUInt32(-32)─┬─toUInt16('16')─┬─toUInt8(8.8)─┐ │ 9223372036854775808 │ 4294967264 │ 16 │ 8 │ └─────────────────────┴───────────────┴────────────────┴──────────────┘
对于 DateTime 参数:将值转换为类型为 UInt32 的数字——Unix 时间戳(https://en.wikipedia.org/wiki/Unix_time)。
对于字符串参数:根据时区(可选的第二个参数,默认使用服务器时区)将输入字符串转换为日期时间并返回相应的 unix 时间戳。
语法
toUnixTimestamp(datetime) toUnixTimestamp(str, [timezone]) sql
参数
datetime
约会时间str
日期时间字符串timezone
(可选)- 时区返回值
UInt32
。示例
SELECT toUnixTimestamp('2017-11-05 08:07:47', 'Asia/Tokyo') AS unix_timestamp
┌─unix_timestamp─┐ │ 1509836867 │ └────────────────┘
SELECT toUnixTimestamp(toDateTime('2017-11-05 08:07:47', 'Asia/Tokyo')) AS unix_timestamp
┌─unix_timestamp─┐ │ 1509836867 │ └────────────────┘