四、clickhouse类型转换函数
类型转换函数部分示例:
SELECT toInt8(12.3334343), toFloat32(10.001), toFloat64(1.000040); SELECT toString(now()); SELECT now() AS now_local, toString(now(), 'Asia/Yekaterinburg') AS now_yekat; SELECT now() AS now_local, toDate(now()), toDateTime(now()), toUnixTimestamp(now()); 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; WITH toDate('2019-01-01') AS date, INTERVAL 1 WEEK AS interval_week, toIntervalWeek(1) AS interval_to_week, toIntervalMonth(1) AS interval_to_month SELECT date + interval_week, date + interval_to_week, date + interval_to_month; WITH toDateTime('2019-01-01 12:10:10') as datetime, INTERVAL 1 HOUR AS interval_hour, toIntervalHour(1) as invterval_to_hour SELECT plus(datetime, interval_hour), plus(datetime, invterval_to_hour);
--注意:
--当你把一个值从一个类型转换为另外一个类型的时候,你需要注意的是这是一个不安全的操作,可能导致数据的丢失。数据丢失一般发生在你将一个大的数据类型转换为小的数据类型的时候,或者你把两个不同的数据类型相互转换的时候。
toInt(8 | 16 | 32 | 64 )
转换一个输入值为Int类型。这个函数包括:
toInt8(expr)
— 结果为Int8
数据类型。toInt16(expr)
— 结果为Int16
数据类型。toInt32(expr)
— 结果为Int32
数据类型。toInt64(expr)
— 结果为Int64
数据类型。
参数
expr
— 表达式返回一个数字或者代表数值类型的字符串。不支持二进制、八进制、十六进制的数字形式,有效数字之前的0也会被忽略。
返回值
整型在Int8
, Int16
, Int32
,或者 Int64
的数据类型。
函数使用rounding towards zero原则,这意味着会截断丢弃小数部分的数值。
NaN and Inf转换是不确定的。具体视情况而定
例子
SELECT toInt64('67888888888888899999999999999999999999999'), toInt32(32), toInt16('16'), toInt8(8.8) Query id: 5e6028ee-7118-4ae6-8c98-0cfac339735f ┌─toInt64('67888888888888899999999999999999999999999')─┬─toInt32(32)─┬─toInt16('16')─┬─toInt8(8.8)─┐ │ 5217342020372135935 │ 32 │ 16 │ 8 │ └──────────────────────────────────────────────────────┴─────────────┴───────────────┴─────────────┘
toInt(8 | 16 | 32 | 64)OrZero
这个函数需要一个字符类型的入参,然后尝试把它转为Int (8 | 16 | 32 | 64)
,如果转换失败直接返回0。
例子
SELECT toInt64OrZero('123123'), toInt8OrZero('123qwe123') Query id: f303b64b-72a6-48f0-bc41-e104ba2ed933 ┌─toInt64OrZero('123123')─┬─toInt8OrZero('123qwe123')─┐ │ 123123 │ 0 │ └─────────────────────────┴───────────────────────────┘
toInt(8 | 16 | 32 | 64)OrNull
这个函数需要一个字符类型的入参,然后尝试把它转为Int (8 | 16 | 32 | 64)
,如果转换失败直接返回NULL
。
例子
SELECT toInt64OrNull('123123'), toInt8OrNull('123qwe123') Query id: 208ce15a-2e72-408e-a6ea-9d22bf695e44 ┌─toInt64OrNull('123123')─┬─toInt8OrNull('123qwe123')─┐ │ 123123 │ ᴺᵁᴸᴸ │ └─────────────────────────┴───────────────────────────┘
toUInt (8 | 16 | 32 | 64 )
转换一个输入值到UInt类型。 这个函数包括:
toUInt8(expr)
— 结果为UInt8
数据类型。toUInt16(expr)
— 结果为UInt16
数据类型。toUInt32(expr)
— 结果为UInt32
数据类型。toUInt64(expr)
— 结果为UInt64
数据类型。
参数
expr
— 表达式返回一个数字或者代表数值类型的字符串。不支持二进制、八进制、十六进制的数字形式,有效数字之前的0也会被忽略。
返回值
整型在UInt8
, UInt16
, UInt32
,或者 UInt64
的数据类型。
函数使用rounding towards zero原则,这意味着会截断丢弃小数部分的数值。
对于负数和NaN and Inf来说转换的结果是不确定的。如果你传入一个负数,比如:'-32'
,ClickHouse会抛出异常。
例子
SELECT toUInt64(8.922222222222223e25), toUInt32(-32), toUInt16('16'), toUInt8(8.8) Query id: e84e548f-0070-4912-90d6-9c91b8aec14c ┌─toUInt64(8.922222222222223e25)─┬─toUInt32(-32)─┬─toUInt16('16')─┬─toUInt8(8.8)─┐ │ 9223372036854775808 │ 4294967264 │ 16 │ 8 │ └────────────────────────────────┴───────────────┴────────────────┴──────────────┘
toUInt(8|16|32|64)OrZero
toUInt(8|16|32|64)OrNull
toFloat(32|64)
toFloat(32|64)OrZero
toFloat(32|64)OrNull
toDate
toDateOrZero
toDateOrNull
toDateTime
toDateTimeOrZero
toDateTimeOrNull
例子
SELECT toUInt16OrZero('123qwe123'), toUInt32OrNull('222qwe123'), toFloat32('2344555555.66'), toFloat32OrZero('2ttte123'), toFloat64OrNull('2ii623') Query id: 9d7c04cd-4f33-4b5f-85be-1bf12483efe1 ┌─toUInt16OrZero('123qwe123')─┬─toUInt32OrNull('222qwe123')─┬─toFloat32('2344555555.66')─┬─toFloat32OrZero('2ttte123')─┬─toFloat64OrNull('2ii623')─┐ │ 0 │ ᴺᵁᴸᴸ │ 2344555500 │ 0 │ ᴺᵁᴸᴸ │ └─────────────────────────────┴─────────────────────────────┴────────────────────────────┴─────────────────────────────┴───────────────────────────┘
SELECT toDate('2022-04-22'), toDateOrZero('2022-05'), toDateOrNull('90099-111'), toDateTime('2022-04-01'), toDateTimeOrZero('9977'), toDateTimeOrNull('44455') Query id: ade131c8-65ae-4453-8df4-7f732faf55bd ┌─toDate('2022-04-22')─┬─toDateOrZero('2022-05')─┬─toDateOrNull('90099-111')─┬─toDateTime('2022-04-01')─┬─toDateTimeOrZero('9977')─┬─toDateTimeOrNull('44455')─┐ │ 2022-04-22 │ 1970-01-01 │ ᴺᵁᴸᴸ │ 2022-04-01 00:00:00 │ 1970-01-01 08:00:00 │ 1970-01-01 20:20:55 │ └──────────────────────┴─────────────────────────┴───────────────────────────┴──────────────────────────┴──────────────────────────┴───────────────────────────┘
toDecimal(32 | 64 | 128 )
转换 value
到Decimal类型的值,其中精度为S
。value
可以是一个数字或者一个字符串。S
指定小数位的精度。
toDecimal32(value, S)
toDecimal64(value, S)
toDecimal128(value, S)
SELECT toDecimal32('452.7899944', 6), toDecimal64('422.7899944', 3), toDecimal128('422.7899944', 2) Query id: 57ef4851-28fc-4c3e-95bd-27c269db8e8b ┌─toDecimal32('452.7899944', 6)─┬─toDecimal64('422.7899944', 3)─┬─toDecimal128('422.7899944', 2)─┐ │ 452.789994 │ 422.789 │ 422.78 │ └───────────────────────────────┴───────────────────────────────┴────────────────────────────────┘
toDecimal(32|64|128)OrNull
转换一个输入的字符到Nullable(Decimal(P,S))类型的数据。这个函数包括:
toDecimal32OrNull(expr, S)
— 结果为Nullable(Decimal32(S))
数据类型。toDecimal64OrNull(expr, S)
— 结果为Nullable(Decimal64(S))
数据类型。toDecimal128OrNull(expr, S)
— 结果为Nullable(Decimal128(S))
数据类型。
如果在解析输入值发生错误的时候你希望得到一个NULL
值而不是抛出异常,你可以使用该函数。
参数
expr
— 表达式返回一个String类型的数据。 ClickHouse倾向于文本类型的表示带小数类型的数值,比如'1.111'
。S
— 小数位的精度。
返回值
Nullable(Decimal(P,S))
类型的数据,包括:
- 如果有的话,小数位
S
。 - 如果解析错误或者输入的数字的小数位多于
S
,那结果为NULL
。
例子
SELECT toDecimal32OrNull(toString(-1.111), 5) AS val, toTypeName(val) Query id: e9ea6562-02c2-4e9f-b3d2-4eac0c7fd117 ┌────val─┬─toTypeName(toDecimal32OrNull(toString(-1.111), 5))─┐ │ -1.111 │ Nullable(Decimal(9, 5)) │ └────────┴────────────────────────────────────────────────────┘
toDecimal(32|64|128)OrZero
转换输入值为Decimal(P,S)类型数据。这个函数包括:
toDecimal32OrZero( expr, S)
— 结果为Decimal32(S)
数据类型。toDecimal64OrZero( expr, S)
— 结果为Decimal64(S)
数据类型。toDecimal128OrZero( expr, S)
— 结果为Decimal128(S)
数据类型。
当解析错误的时候,你不需要抛出异常而希望得到0
值,你可以使用该函数。
参数
expr
— 表达式返回一个String类型的数据。 ClickHouse倾向于文本类型的表示带小数类型的数值,比如'1.111'
。S
— 小数位的精度。
返回值
Nullable(Decimal(P,S))
数据类型中的值。该值包含:
- 如果有的话,小数位
S
。 - 如果解析错误或者输入的数字的小数位多于
S
,那结果为小数位精度为S
的0
。
SELECT toDecimal32OrZero(toString(-1.111), 5) AS val, toTypeName(val) Query id: 042e0052-c441-46ff-acfa-4663e2244f1f ┌────val─┬─toTypeName(toDecimal32OrZero(toString(-1.111), 5))─┐ │ -1.111 │ Decimal(9, 5) │ └────────┴────────────────────────────────────────────────────┘
toString
这些函数用于在数字、字符串(不包含FixedString)、Date以及DateTime之间互相转换。 所有的函数都接收一个参数。
当将其他类型转换到字符串或从字符串转换到其他类型时,使用与TabSeparated格式相同的规则对字符串的值进行格式化或解析。如果无法解析字符串则抛出异常并取消查询。
当将Date转换为数字或反之,Date对应Unix时间戳的天数。 将DataTime转换为数字或反之,DateTime对应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))’。
Date与DateTime之间的转换以更为自然的方式进行:通过添加空的time或删除time。
数值类型之间的转换与C++中不同数字类型之间的赋值相同的规则。
此外,DateTime参数的toString函数可以在第二个参数中包含时区名称。 例如:Asia/Yekaterinburg
在这种情况下,时间根据指定的时区进行格式化。
SELECT now() AS now_local, toString(now(), 'Asia/Yekaterinburg') AS now_yekat Query id: aa8d82d0-44f6-4827-b9ff-7ad7e0b3a5f4 ┌───────────now_local─┬─now_yekat───────────┐ │ 2022-04-29 09:29:08 │ 2022-04-29 06:29:08 │ └─────────────────────┴─────────────────────┘
toFixedString(s,N )
将String类型的参数转换为FixedString(N)类型的值(具有固定长度N的字符串)。N必须是一个常量。 如果字符串的字节数少于N,则向右填充空字节。如果字符串的字节数多于N,则抛出异常。
toStringCutToZero(s )
接收String或FixedString参数。返回String,其内容在找到的第一个零字节处被截断。
示例:
SELECT toFixedString('foo', 8) AS s, toStringCutToZero(s) AS s_cut Query id: 15765aa8-691c-454c-87ef-1907063e9f05 ┌─s───┬─s_cut─┐ │ foo │ foo │ └─────┴───────┘ 1 rows in set. Elapsed: 0.025 sec.
reinterpretAsUInt(8|16|32|64)
reinterpretAsInt(8|16|32|64)
reinterpretAsFloat(32|64)
reinterpretAsDate
reinterpretAsDateTime
这些函数接收一个字符串,并将放在字符串开头的字节解释为主机顺序中的数字(little endian)。如果字符串不够长,则函数就像使用必要数量的空字节填充字符串一样。如果字符串比需要的长,则忽略额外的字节。Date被解释为Unix时间戳的天数,DateTime被解释为Unix时间戳。
例子
SELECT reinterpretAsUInt8('9877.22'), reinterpretAsInt8('4666444'), reinterpretAsFloat32('24555.8889'), reinterpretAsDate('2022-04-05'), reinterpretAsDateTime('2022-04-06 13:45:23 124') Query id: 509b455b-60a3-44aa-8394-761dacfd8fb0 ┌─reinterpretAsUInt8('9877.22')─┬─reinterpretAsInt8('4666444')─┬─reinterpretAsFloat32('24555.8889')─┬─reinterpretAsDate('2022-04-05')─┬─reinterpretAsDateTime('2022-04-06 13:45:23 124')─┐ │ 57 │ 52 │ 6.750371e-7 │ 2003-10-13 │ 1996-09-08 10:32:18 │ └───────────────────────────────┴──────────────────────────────┴────────────────────────────────────┴─────────────────────────────────┴──────────────────────────────────────────────────┘
reinterpretAsString
此函数接收数字、Date或DateTime,并返回一个字符串,其中包含表示主机顺序(小端)的相应值的字节。从末尾删除空字节。例如,UInt32类型值255是一个字节长的字符串。
reinterpretAsFixedString
此函数接收数字、Date或DateTime,并返回包含表示主机顺序(小端)的相应值的字节的FixedString。从末尾删除空字节。例如,UInt32类型值255是一个长度为一个字节的FixedString。
例子
SELECT reinterpretAsString('2022-04-16 13:45:23'), reinterpretAsFixedString(422455521111) Query id: c47e036e-d5a9-433c-9d4e-c2695ea2c4f6 ┌─reinterpretAsString('2022-04-16 13:45:23')─┬─reinterpretAsFixedString(422455521111)─┐ │ 2022-04-16 13:45:23 │ W¯O\b │ └────────────────────────────────────────────┴────────────────────────────────────────┘
CAST(x, T )
将’x’转换为’t’数据类型。还支持语法CAST(x AS t)
示例:
SELECT '2016-06-15 23:00:00' AS timestamp, CAST(timestamp, 'DateTime') AS datetime, CAST(timestamp, 'Date') AS date, CAST(timestamp, 'String') AS string, CAST(timestamp, 'FixedString(22)') AS fixed_string Query id: 7648dafb-c56d-4078-99db-e63b658d34ad ┌─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(N)类型的参数。
支持将数据转换为可为空。例如:
SELECT toTypeName(city) FROM agg_table_basic Query id: 16e17c24-b809-473d-9f0a-a0b5d8d026c8 ┌─toTypeName(city)─┐ │ String │ └──────────────────┘ ┌─toTypeName(city)─┐ │ String │ │ String │ └──────────────────┘
SELECT toTypeName(CAST(city, 'Nullable(UInt16)')) FROM agg_table_basic Query id: 8d9334ab-6ea3-444c-80f7-e918969f0c0a ┌─toTypeName(CAST(city, 'Nullable(UInt16)'))─┐ │ Nullable(UInt16) │ └────────────────────────────────────────────┘ ┌─toTypeName(CAST(city, 'Nullable(UInt16)'))─┐ │ Nullable(UInt16) │ │ Nullable(UInt16) │ └────────────────────────────────────────────┘
toInterval(年|季度|月|周|日|小时|分钟|秒)
把一个数值类型的值转换为Interval类型的数据。
语法
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, toIntervalWeek(1) AS interval_week, toIntervalWeek(1) AS interval_to_week SELECT date + interval_week, date + interval_to_week Query id: 7da100bf-ae9d-4521-9577-e2edd39a17a3 ┌─plus(date, interval_week)─┬─plus(date, interval_to_week)─┐ │ 2019-01-08 │ 2019-01-08 │ └───────────────────────────┴──────────────────────────────┘
parseDateTimeBestEffort
把String类型的时间日期转换为DateTime数据类型。
该函数可以解析ISO 8601,RFC 1123 - 5.2.14 RFC-822 Date and Time Specification或者ClickHouse的一些别的时间日期格式。
语法
parseDateTimeBestEffort(time_string [, time_zone]);
参数
time_string
— 字符类型的时间和日期。time_zone
— 字符类型的时区。
非标准格式的支持
- 9位或者10位的数字时间,unix timestamp.
- 时间和日期组成的字符串:
YYYYMMDDhhmmss
,DD/MM/YYYY hh:mm:ss
,DD-MM-YY hh:mm
,YYYY-MM-DD hh:mm:ss
等。 - 只有日期的字符串:
YYYY
,YYYYMM
,YYYY*MM
,DD/MM/YYYY
,DD-MM-YY
等。 - 只有天和时间:
DD
,DD hh
,DD hh:mm
。这种情况下YYYY-MM
默认为2000-01
。 - 包含时间日期以及时区信息:
YYYY-MM-DD hh:mm:ss ±h:mm
等。例如:2020-12-12 17:36:00 -5:00
。
对于所有的格式来说,这个函数通过全称或者第一个三个字符的月份名称来解析月份,比如:24/DEC/18
, 24-Dec-18
, 01-September-2018
。
返回值
DateTime
类型数据。
例子
SELECT parseDateTimeBestEffort('12/12/2020 12:12:57') AS parseDateTimeBestEffort Query id: c1df69ce-a1ee-4524-8aac-889631fa7a9e ┌─parseDateTimeBestEffort─┐ │ 2020-12-12 12:12:57 │ └─────────────────────────┘
SELECT parseDateTimeBestEffort('Sat, 18 Aug 2018 07:22:16 GMT', 'Asia/Istanbul') AS parseDateTimeBestEffort Query id: 50719349-0bfa-46bf-a971-da20a93c7673 ┌─parseDateTimeBestEffort─┐ │ 2018-08-18 10:22:16 │ └─────────────────────────┘
SELECT parseDateTimeBestEffort('1284101485') AS parseDateTimeBestEffort Query id: de19b0cb-baa0-4733-a57d-21a7cb802103 ┌─parseDateTimeBestEffort─┐ │ 2010-09-10 14:51:25 │ └─────────────────────────┘
SELECT parseDateTimeBestEffort('2018-12-12 10:12:12') AS parseDateTimeBestEffort Query id: 65da751b-1160-43bd-81a6-bd985488f7b5 ┌─parseDateTimeBestEffort─┐ │ 2018-12-12 10:12:12 │ └─────────────────────────┘
SELECT parseDateTimeBestEffort('10 20:19') Query id: d99096a3-a4fd-4f1f-ba9b-66f9f4f20194 ┌─parseDateTimeBestEffort('10 20:19')─┐ │ 2000-01-10 20:19:00 │ └─────────────────────────────────────┘
parseDateTimeBestEffortOrNull
这个函数和parseDateTimeBestEffort基本一致,除了无法解析返回结果为NULL
。
parseDateTimeBestEffortOrZero
这个函数和parseDateTimeBestEffort基本一致,除了无法解析返回结果为0
。
toLowCardinality
把输入值转换为LowCardianlity的相同类型的数据。
如果要把LowCardinality
类型的数据转换为其他类型,使用CAST函数。比如:CAST(x as String)
。
语法
toLowCardinality(expr)
参数
expr
— 表达式为支持的数据类型的一种。
返回值
expr
的结果。
类型: LowCardinality(expr_result_type)
例子
SELECT toLowCardinality('1345.11') Query id: 33d05784-1e8a-4ecd-97a8-aca0b2acfcfc ┌─toLowCardinality('1345.11')─┐ │ 1345.11 │ └─────────────────────────────┘
toUnixTimestamp64Milli
toUnixTimestamp64Micro
toUnixTimestamp64Nano
把一个DateTime64
类型的数据转换为Int64
类型的数据,结果包含固定亚秒的精度。输入的值是变大还是变低依赖于输入的精度。需要注意的是输出的值是一个UTC的时间戳, 不是同一个时区的DateTime64
值。
语法
toUnixTimestamp64Milli(value)
参数
value
— 任何精度的DateTime64类型的数据。
返回值
value
Int64
类型数据。
例子
WITH toDateTime64('2019-09-16 19:20:12.345678910', 6) AS dt64 SELECT toUnixTimestamp64Milli(dt64) Query id: 8b2858f6-b9b9-4cff-8765-e9886df37e8e ┌─toUnixTimestamp64Milli(dt64)─┐ │ 1568632812345 │ └──────────────────────────────┘
WITH toDateTime64('2019-09-16 19:20:12.345678910', 6) AS dt64 SELECT toUnixTimestamp64Nano(dt64) Query id: d9c07d28-0702-4da2-a144-82aeadd23788 ┌─toUnixTimestamp64Nano(dt64)─┐ │ 1568632812345678000 │ └─────────────────────────────┘
fromUnixTimestamp64Milli
fromUnixTimestamp64Micro
fromUnixTimestamp64Nano
把Int64
类型的数据转换为DateTime64
类型的数据,结果包含固定的亚秒精度和可选的时区。 输入的值是变大还是变低依赖于输入的精度。需要注意的是输入的值是一个UTC的时间戳, 不是一个包含时区的时间戳。
语法
fromUnixTimestamp64Milli(value [, ti])
参数
value
—Int64
类型的数据,可以是任意精度。timezone
—String
类型的时区
返回值
value
DateTime64`类型的数据。
例子
WITH CAST(1234567891011, 'Int64') AS i64 SELECT fromUnixTimestamp64Milli(i64, 'UTC') Query id: 6bdad53e-f25d-4b3c-9b38-51eb3a189ddb ┌─fromUnixTimestamp64Milli(i64, 'UTC')─┐ │ 2009-02-13 23:31:31.011 │ └──────────────────────────────────────┘
accurateCastOrNull
对字段值进行类型转换校验,转换成功返回转换后的类型数据,否则Null
SELECT accurateCastOrNull(2, 'Int8'), accurateCastOrNull('ss', 'Int8'); SELECT accurateCastOrNull(2, 'Int8'), accurateCastOrNull('ss', 'Int8') Query id: 853f4120-5c0e-484e-af07-e63690b20a80 ┌─accurateCastOrNull(2, 'Int8')─┬─accurateCastOrNull('ss', 'Int8')─┐ │ 2 │ ᴺᵁᴸᴸ │ └───────────────────────────────┴──────────────────────────────────┘ 1 rows in set. Elapsed: 0.002 sec.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?