類型轉換函數部分示例:
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類型的數據。
返回值
valueInt64類型數據。
例子
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類型的時區
返回值
valueDateTime64`類型的數據。
例子
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.
