Type Conversion Functions
Common Issues with Data Conversion
ClickHouse generally uses the same behavior as C++ programs .
to<type>
functions and
cast
behave differently in some cases, for example in case of
LowCardinality
:
cast
removes
LowCardinality
trait
to<type>
functions don't. The same with
Nullable
, this behaviour is not compatible with SQL standard, and it can be changed using
cast_keep_nullable
setting.
Be aware of potential data loss if values of a datatype are converted to a smaller datatype (for example from
Int64
to
Int32
) or between
incompatible datatypes (for example from
String
to
Int
). Make sure to check carefully if the result is as expected.
Example:
SELECT
toTypeName(toLowCardinality('') AS val) AS source_type,
toTypeName(toString(val)) AS to_type_result_type,
toTypeName(CAST(val, 'String')) AS cast_result_type
┌─source_type────────────┬─to_type_result_type────┬─cast_result_type─┐
│ LowCardinality(String) │ LowCardinality(String) │ String │
└────────────────────────┴────────────────────────┴──────────────────┘
SELECT
toTypeName(toNullable('') AS val) AS source_type,
toTypeName(toString(val)) AS to_type_result_type,
toTypeName(CAST(val, 'String')) AS cast_result_type
┌─source_type──────┬─to_type_result_type─┬─cast_result_type─┐
│ Nullable(String) │ Nullable(
String) │ String │
└──────────────────┴─────────────────────┴──────────────────┘
SELECT
toTypeName(toNullable('') AS val) AS source_type,
toTypeName(toString(val)) AS to_type_result_type,
toTypeName(CAST(val, 'String')) AS cast_result_type
SETTINGS cast_keep_nullable = 1
┌─source_type──────┬─to_type_result_type─┬─cast_result_type─┐
│ Nullable(String) │ Nullable(String) │ Nullable(String) │
└──────────────────┴─────────────────────┴──────────────────┘
toInt(8 | 16 | 32 | 64 | 128 | 256)
Converts an input value to a value the Int data type. This function family includes:
-
toInt8(expr)
— Converts to a value of data typeInt8
. -
toInt16(expr)
— Converts to a value of data typeInt16
. -
toInt32(expr)
— Converts to a value of data typeInt32
. -
toInt64(expr)
— Converts to a value of data typeInt64
. -
toInt128(expr)
— Converts to a value of data typeInt128
. -
toInt256(expr)
— Converts to a value of data typeInt256
.
Arguments
-
expr
— Expression returning a number or a string with the decimal representation of a number. Binary, octal, and hexadecimal representations of numbers are not supported. Leading zeroes are stripped.
Returned value
Integer value in the
Int8
,
Int16
,
Int32
,
Int64
,
Int128
or
Int256
data type.
Functions use rounding towards zero , meaning they truncate fractional digits of numbers.
The behavior of functions for the NaN and Inf arguments is undefined. Remember about numeric conversions issues , when using the functions.
Example
Query:
SELECT toInt64(nan), toInt32(32), toInt16('16'), toInt8(8.8);
Result:
┌─────────toInt64(nan)─┬─toInt32(32)─┬─toInt16('16')─┬─toInt8(8.8)─┐
│ -9223372036854775808 │ 32 │ 16 │ 8 │
└──────────────────────┴─────────────┴───────────────┴─────────────┘
toInt(8 | 16 | 32 | 64 | 128 | 256)OrZero
Takes an argument of type
String
and tries to parse it into an Int (8
|
16
|
32
|
64
|
128
|
256). If unsuccessful, returns
0
.
Example
Query:
SELECT toInt64OrZero('123123'), toInt8OrZero('123qwe123');
Result:
┌─toInt64OrZero('123123')─┬─toInt8OrZero('123qwe123')─┐
│ 123123 │ 0 │
└─────────────────────────┴───────────────────────────┘
toInt(8 | 16 | 32 | 64 | 128 | 256)OrNull
It takes an argument of type String and tries to parse it into Int (8
|
16
|
32
|
64
|
128
|
256). If unsuccessful, returns
NULL
.
Example
Query:
SELECT toInt64OrNull('123123'), toInt8OrNull('123qwe123');
Result:
┌─toInt64OrNull('123123')─┬─toInt8OrNull('123qwe123')─┐
│ 123123 │ ᴺᵁᴸᴸ │
└─────────────────────────┴───────────────────────────┘
toInt(8 | 16 | 32 | 64 | 128 | 256)OrDefault
It takes an argument of type String and tries to parse it into Int (8 | 16 | 32 | 64 | 128 | 256). If unsuccessful, returns the default type value.
Example
Query:
SELECT toInt64OrDefault('123123', cast('-1' as Int64)), toInt8OrDefault('123qwe123', cast('-1' as Int8));
Result:
┌─toInt64OrDefault('123123', CAST('-1', 'Int64'))─┬─toInt8OrDefault('123qwe123', CAST('-1', 'Int8'))─┐
│ 123123 │ -1 │
└─────────────────────────────────────────────────┴──────────────────────────────────────────────────┘
toUInt(8 | 16 | 32 | 64 | 256)
Converts an input value to the UInt data type. This function family includes:
-
toUInt8(expr)
— Converts to a value of data typeUInt8
. -
toUInt16(expr)
— Converts to a value of data typeUInt16
. -
toUInt32(expr)
— Converts to a value of data typeUInt32
. -
toUInt64(expr)
— Converts to a value of data typeUInt64
. -
toUInt256(expr)
— Converts to a value of data typeUInt256
.
Arguments
-
expr
— Expression returning a number or a string with the decimal representation of a number. Binary, octal, and hexadecimal representations of numbers are not supported. Leading zeroes are stripped.
Returned value
-
Integer value in the
UInt8
,UInt16
,UInt32
,UInt64
orUInt256
data type.
Functions use rounding towards zero , meaning they truncate fractional digits of numbers.
The behavior of functions for negative arguments and for the
NaN and Inf
arguments is undefined. If you pass a string with a negative number, for example
'-32'
, ClickHouse raises an exception. Remember about
numeric conversions issues
, when using the functions.
Example
Query:
SELECT toUInt64(nan), toUInt32(-32), toUInt16('16'), toUInt8(8.8);
Result:
┌───────toUInt64(nan)─┬─toUInt32(-32)─┬─toUInt16('16')─┬─toUInt8(8.8)─┐
│ 9223372036854775808 │ 4294967264 │ 16 │ 8 │
└─────────────────────┴───────────────┴────────────────┴──────────────┘
toUInt(8 | 16 | 32 | 64 | 256)OrZero
toUInt(8 | 16 | 32 | 64 | 256)OrNull
toUInt(8 | 16 | 32 | 64 | 256)OrDefault
toFloat(32 | 64)
toFloat(32 | 64)OrZero
toFloat(32 | 64)OrNull
toFloat(32 | 64)OrDefault
toDate
Converts the argument to Date data type.
If the argument is DateTime or DateTime64 , it truncates it and leaves the date component of the DateTime:
SELECT
now() AS x,
toDate(x)
┌───────────────────x─┬─toDate(now())─┐
│ 2022-12-30 13:44:17 │ 2022-12-30 │
└─────────────────────┴───────────────┘
If the argument is a String , it is parsed as Date or DateTime . If it was parsed as DateTime , the date component is being used:
SELECT
toDate('2022-12-30') AS x,
toTypeName(x)
┌──────────x─┬─toTypeName(toDate('2022-12-30'))─┐
│ 2022-12-30 │ Date │
└────────────┴──────────────────────────────────┘
1 row in set. Elapsed: 0.001 sec.
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 │
└────────────┴───────────────────────────────────────────┘
If the argument is a number and looks like a UNIX timestamp (is greater than 65535), it is interpreted as a DateTime , then truncated to Date in the current timezone. The timezone argument can be specified as a second argument of the function. The truncation to Date depends on the timezone:
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
Row 1:
──────
current_time: 2022-12-30 13:51:54
ts: 1672404714
time_Amsterdam: 2022-12-30 13:51:54
time_Samoa: 2022-12-31 01:51:54
date_Amsterdam: 2022-12-30
date_Samoa: 2022-12-31
date_Amsterdam_2: 2022-12-30
date_Samoa_2: 2022-12-31
The example above demonstrates how the same UNIX timestamp can be interpreted as different dates in different time zones.
If the argument is a number and it is smaller than 65536, it is interpreted as the number of days since 1970-01-01 (the first UNIX day) and converted to
Date
. It corresponds to the internal numeric representation of the
Date
data type. Example:
SELECT toDate(12345)
┌─toDate(12345)─┐
│ 2003-10-20 │
└───────────────┘
This conversion does not depend on timezones.
If the argument does not fit in the range of the Date type, it results in an implementation-defined behavior, that can saturate to the maximum supported date or overflow:
SELECT toDate(10000000000.)
┌─toDate(10000000000.)─┐
│ 2106-02-07 │
└──────────────────────┘
The function
toDate
can be also written in alternative forms:
SELECT
now() AS time,
toDate(time),
DATE(time),
CAST(time, 'Date')
┌────────────────time─┬─toDate(now())─┬─DATE(now())─┬─CAST(now(), 'Date')─┐
│ 2022-12-30 13:54:58 │ 2022-12-30 │ 2022-12-30 │ 2022-12-30 │
└─────────────────────┴───────────────┴─────────────┴─────────────────────┘
toDateOrZero
The same as toDate but returns lower boundary of Date if an invalid argument is received. Only String argument is supported.
Example
Query:
SELECT toDateOrZero('2022-12-30'), toDateOrZero('');
Result:
┌─toDateOrZero('2022-12-30')─┬─toDateOrZero('')─┐
│ 2022-12-30 │ 1970-01-01 │
└────────────────────────────┴──────────────────┘
toDateOrNull
The same as
toDate
but returns
NULL
if an invalid argument is received. Only
String
argument is supported.
Example
Query:
SELECT toDateOrNull('2022-12-30'), toDateOrNull('');
Result:
┌─toDateOrNull('2022-12-30')─┬─toDateOrNull('')─┐
│ 2022-12-30 │ ᴺᵁᴸᴸ │
└────────────────────────────┴──────────────────┘
toDateOrDefault
Like toDate but if unsuccessful, returns a default value which is either the second argument (if specified), or otherwise the lower boundary of Date .
Syntax
toDateOrDefault(expr [, default_value])
Example
Query:
SELECT toDateOrDefault('2022-12-30'), toDateOrDefault('', '2023-01-01'::Date);
Result:
┌─toDateOrDefault('2022-12-30')─┬─toDateOrDefault('', CAST('2023-01-01', 'Date'))─┐
│ 2022-12-30 │ 2023-01-01 │
└───────────────────────────────┴─────────────────────────────────────────────────┘
toDateTime
Converts an input value to DateTime .
Syntax
toDateTime(expr[, time_zone ])
Arguments
If
expr
is a number, it is interpreted as the number of seconds since the beginning of the Unix Epoch (as Unix timestamp).
If
expr
is a
String
, it may be interpreted as a Unix timestamp or as a string representation of date / date with time.
Thus, parsing of short numbers' string representations (up to 4 digits) is explicitly disabled due to ambiguity, e.g. a string
'1999'
may be both a year (an incomplete string representation of Date / DateTime) or a unix timestamp. Longer numeric strings are allowed.
Returned value
- A date time. DateTime
Example
Query:
SELECT toDateTime('2022-12-30 13:44:17'), toDateTime(1685457500, 'UTC');
Result:
┌─toDateTime('2022-12-30 13:44:17')─┬─toDateTime(1685457500, 'UTC')─┐
│ 2022-12-30 13:44:17 │ 2023-05-30 14:38:20 │
└───────────────────────────────────┴───────────────────────────────┘
toDateTimeOrZero
The same as toDateTime but returns lower boundary of DateTime if an invalid argument is received. Only String argument is supported.
Example
Query:
SELECT toDateTimeOrZero('2022-12-30 13:44:17'), toDateTimeOrZero('');
Result:
┌─toDateTimeOrZero('2022-12-30 13:44:17')─┬─toDateTimeOrZero('')─┐
│ 2022-12-30 13:44:17 │ 1970-01-01 00:00:00 │
└─────────────────────────────────────────┴──────────────────────┘
toDateTimeOrNull
The same as
toDateTime
but returns
NULL
if an invalid argument is received. Only
String
argument is supported.
Example
Query:
SELECT toDateTimeOrNull('2022-12-30 13:44:17'), toDateTimeOrNull('');
Result:
┌─toDateTimeOrNull('2022-12-30 13:44:17')─┬─toDateTimeOrNull('')─┐
│ 2022-12-30 13:44:17 │ ᴺᵁᴸᴸ │
└─────────────────────────────────────────┴──────────────────────┘
toDateTimeOrDefault
Like toDateTime but if unsuccessful, returns a default value which is either the third argument (if specified), or otherwise the lower boundary of DateTime .
Syntax
toDateTimeOrDefault(expr [, time_zone [, default_value]])
Example
Query:
SELECT toDateTimeOrDefault('2022-12-30 13:44:17'), toDateTimeOrDefault('', 'UTC', '2023-01-01'::DateTime('UTC'));
Result:
┌─toDateTimeOrDefault('2022-12-30 13:44:17')─┬─toDateTimeOrDefault('', 'UTC', CAST('2023-01-01', 'DateTime(\'UTC\')'))─┐
│ 2022-12-30 13:44:17 │ 2023-01-01 00:00:00 │
└────────────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────┘
toDate32
Converts the argument to the
Date32
data type. If the value is outside the range,
toDate32
returns the border values supported by
Date32
. If the argument has
Date
type, it's borders are taken into account.
Syntax
toDate32(expr)
Arguments
Returned value
- A calendar date. Type Date32 .
Example
- The value is within the range:
SELECT toDate32('1955-01-01') AS value, toTypeName(value);
┌──────value─┬─toTypeName(toDate32('1925-01-01'))─┐
│ 1955-01-01 │ Date32 │
└────────────┴────────────────────────────────────┘
- The value is outside the range:
SELECT toDate32('1899-01-01') AS value, toTypeName(value);
┌──────value─┬─toTypeName(toDate32('1899-01-01'))─┐
│ 1900-01-01 │ Date32 │
└────────────┴────────────────────────────────────┘
- With Date argument:
SELECT toDate32(toDate('1899-01-01')) AS value, toTypeName(value);
┌──────value─┬─toTypeName(toDate32(toDate('1899-01-01')))─┐
│ 1970-01-01 │ Date32 │
└────────────┴────────────────────────────────────────────┘
toDate32OrZero
The same as toDate32 but returns the min value of Date32 if an invalid argument is received.
Example
Query:
SELECT toDate32OrZero('1899-01-01'), toDate32OrZero('');
Result:
┌─toDate32OrZero('1899-01-01')─┬─toDate32OrZero('')─┐
│ 1900-01-01 │ 1900-01-01 │
└──────────────────────────────┴────────────────────┘
toDate32OrNull
The same as
toDate32
but returns
NULL
if an invalid argument is received.
Example
Query:
SELECT toDate32OrNull('1955-01-01'), toDate32OrNull('');
Result:
┌─toDate32OrNull('1955-01-01')─┬─toDate32OrNull('')─┐
│ 1955-01-01 │ ᴺᵁᴸᴸ │
└──────────────────────────────┴────────────────────┘
toDate32OrDefault
Converts the argument to the
Date32
data type. If the value is outside the range,
toDate32OrDefault
returns the lower border value supported by
Date32
. If the argument has
Date
type, it's borders are taken into account. Returns default value if an invalid argument is received.
Example
Query:
SELECT
toDate32OrDefault('1930-01-01', toDate32('2020-01-01')),
toDate32OrDefault('xx1930-01-01', toDate32('2020-01-01'));
Result:
┌─toDate32OrDefault('1930-01-01', toDate32('2020-01-01'))─┬─toDate32OrDefault('xx1930-01-01', toDate32('2020-01-01'))─┐
│ 1930-01-01 │ 2020-01-01 │
└─────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────┘
toDateTime64
Converts the argument to the DateTime64 data type.
Syntax
toDateTime64(expr, scale, [timezone])
Arguments
-
expr
— The value. String , UInt32 , Float or DateTime . -
scale
- Tick size (precision): 10 -precision seconds. Valid range: [ 0 : 9 ] . -
timezone
- Time zone of the specified datetime64 object.
Returned value
- A calendar date and time of day, with sub-second precision.
Type: DateTime64 .
Example
- The value is within the range:
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) │
└─────────────────────────┴────────────────────────────────────────────────────────┘
- As decimal with precision:
SELECT toDateTime64(1546300800.000, 3) AS value, toTypeName(value);
┌───────────────────value─┬─toTypeName(toDateTime64(1546300800., 3))─┐
│ 2019-01-01 00:00:00.000 │ DateTime64(3) │
└─────────────────────────┴──────────────────────────────────────────┘
Without the decimal point the value is still treated as Unix Timestamp in seconds:
SELECT toDateTime64(
1546300800000, 3) AS value, toTypeName(value);
┌───────────────────value─┬─toTypeName(toDateTime64(1546300800000, 3))─┐
│ 2282-12-31 00:00:00.000 │ DateTime64(3) │
└─────────────────────────┴────────────────────────────────────────────┘
-
With
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') │
└─────────────────────────┴─────────────────────────────────────────────────────────────────────┘
toDateTime64OrZero
toDateTime64OrNull
toDateTime64OrDefault
toDecimal(32 | 64 | 128 | 256)
Converts
value
to the
Decimal
data type with precision of
S
. The
value
can be a number or a string. The
S
(scale) parameter specifies the number of decimal places.
-
toDecimal32(value, S)
-
toDecimal64(value, S)
-
toDecimal128(value, S)
-
toDecimal256(value, S)
toDecimal(32 | 64 | 128 | 256)OrNull
Converts an input string to a Nullable(Decimal(P,S)) data type value. This family of functions includes:
-
toDecimal32OrNull(expr, S)
— Results inNullable(Decimal32(S))
data type. -
toDecimal64OrNull(expr, S)
— Results inNullable(Decimal64(S))
data type. -
toDecimal128OrNull(expr, S)
— Results inNullable(Decimal128(S))
data type. -
toDecimal256OrNull(expr, S)
— Results inNullable(Decimal256(S))
data type.
These functions should be used instead of
toDecimal*()
functions, if you prefer to get a
NULL
value instead of an exception in the event of an input value parsing error.
Arguments
-
expr
— Expression , returns a value in the String data type. ClickHouse expects the textual representation of the decimal number. For example,'1.111'
. -
S
— Scale, the number of decimal places in the resulting value.
Returned value
A value in the
Nullable(Decimal(P,S))
data type. The value contains:
-
Number with
S
decimal places, if ClickHouse interprets the input string as a number. -
NULL
, if ClickHouse can’t interpret the input string as a number or if the input number contains more thanS
decimal places.
Examples
Query:
SELECT toDecimal32OrNull(toString(-1.111), 5) AS val, toTypeName(val);
Result:
┌────val─┬─toTypeName(toDecimal32OrNull(toString(-1.111), 5))─┐
│ -1.111 │ Nullable(Decimal(9, 5)) │
└────────┴────────────────────────────────────────────────────┘
Query:
SELECT toDecimal32OrNull(toString(-1.111), 2) AS val, toTypeName(
val);
Result:
┌──val─┬─toTypeName(toDecimal32OrNull(toString(-1.111), 2))─┐
│ ᴺᵁᴸᴸ │ Nullable(Decimal(9, 2)) │
└──────┴────────────────────────────────────────────────────┘
toDecimal(32 | 64 | 128 | 256)OrDefault
Converts an input string to a Decimal(P,S) data type value. This family of functions includes:
-
toDecimal32OrDefault(expr, S)
— Results inDecimal32(S)
data type. -
toDecimal64OrDefault(expr, S)
— Results inDecimal64(S)
data type. -
toDecimal128OrDefault(expr, S)
— Results inDecimal128(S)
data type. -
toDecimal256OrDefault(expr, S)
— Results inDecimal256(S)
data type.
These functions should be used instead of
toDecimal*()
functions, if you prefer to get a default value instead of an exception in the event of an input value parsing error.
Arguments
-
expr
— Expression , returns a value in the String data type. ClickHouse expects the textual representation of the decimal number. For example,'1.111'
. -
S
— Scale, the number of decimal places in the resulting value.
Returned value
A value in the
Decimal(P,S)
data type. The value contains:
-
Number with
S
decimal places, if ClickHouse interprets the input string as a number. -
Default
Decimal(P,S)
data type value, if ClickHouse can’t interpret the input string as a number or if the input number contains more thanS
decimal places.
Examples
Query:
SELECT toDecimal32OrDefault(toString(-1.111), 5) AS val, toTypeName(val);
Result:
┌────val─┬─toTypeName(toDecimal32OrDefault(toString(-1.111), 5))─┐
│ -1.111 │ Decimal(9, 5) │
└────────┴───────────────────────────────────────────────────────┘
Query:
SELECT toDecimal32OrDefault(toString(-1.111), 2) AS val, toTypeName(val);
Result:
┌─val─┬─toTypeName(toDecimal32OrDefault(toString(-1.111), 2))─┐
│ 0 │ Decimal(9, 2) │
└─────┴───────────────────────────────────────────────────────┘
toDecimal(32 | 64 | 128 | 256)OrZero
Converts an input value to the Decimal(P,S) data type. This family of functions includes:
-
toDecimal32OrZero( expr, S)
— Results inDecimal32(S)
data type. -
toDecimal64OrZero( expr, S)
— Results inDecimal64(S)
data type. -
toDecimal128OrZero( expr, S)
— Results inDecimal128(S)
data type. -
toDecimal256OrZero( expr, S)
— Results inDecimal256(S)
data type.
These functions should be used instead of
toDecimal*()
functions, if you prefer to get a
0
value instead of an exception in the event of an input value parsing error.
Arguments
-
expr
— Expression , returns a value in the String data type. ClickHouse expects the textual representation of the decimal number. For example,'1.111'
. -
S
— Scale, the number of decimal places in the resulting value.
Returned value
A value in the
Nullable(Decimal(P,S))
data type. The value contains:
-
Number with
S
decimal places, if ClickHouse interprets the input string as a number. -
0 with
S
decimal places, if ClickHouse can’t interpret the input string as a number or if the input number contains more thanS
decimal places.
Example
Query:
SELECT toDecimal32OrZero(toString(-1.111), 5) AS
val, toTypeName(val);
Result:
┌────val─┬─toTypeName(toDecimal32OrZero(toString(-1.111), 5))─┐
│ -1.111 │ Decimal(9, 5) │
└────────┴────────────────────────────────────────────────────┘
Query:
SELECT toDecimal32OrZero(toString(-1.111), 2) AS val, toTypeName(val);
Result:
┌──val─┬─toTypeName(toDecimal32OrZero(toString(-1.111), 2))─┐
│ 0.00 │ Decimal(9, 2) │
└──────┴────────────────────────────────────────────────────┘
toString
Functions for converting between numbers, strings (but not fixed strings), dates, and dates with times. All these functions accept one argument.
When converting to or from a string, the value is formatted or parsed using the same rules as for the TabSeparated format (and almost all other text formats). If the string can’t be parsed, an exception is thrown and the request is canceled.
When converting dates to numbers or vice versa, the date corresponds to the number of days since the beginning of the Unix epoch. When converting dates with times to numbers or vice versa, the date with time corresponds to the number of seconds since the beginning of the Unix epoch.
The date and date-with-time formats for the toDate/toDateTime functions are defined as follows:
YYYY-MM-DD
YYYY-MM-DD hh:mm:ss
As an exception, if converting from UInt32, Int32, UInt64, or Int64 numeric types to Date, and if the number is greater than or equal to 65536, the number is interpreted as a Unix timestamp (and not as the number of days) and is rounded to the date. This allows support for the common occurrence of writing
toDate(unix_timestamp)
, which otherwise would be an error and would require writing the more cumbersome
toDate(toDateTime(unix_timestamp))
.
Conversion between a date and a date with time is performed the natural way: by adding a null time or dropping the time.
Conversion between numeric types uses the same rules as assignments between different numeric types in C++.
Additionally, the toString function of the DateTime argument can take a second String argument containing the name of the time zone. Example:
Asia/Yekaterinburg
In this case, the time is formatted according to the specified time zone.
Example
Query:
SELECT
now() AS now_local,
toString(now(), 'Asia/Yekaterinburg') AS now_yekat;
Result:
┌───────────now_local─┬─now_yekat───────────┐
│ 2016-06-15 00:11:21 │ 2016-06-15 02:11:21 │
└─────────────────────┴─────────────────────┘
Also see the
toUnixTimestamp
function.
toFixedString(s, N)
Converts a String type argument to a FixedString(N) type (a string of fixed length N). If the string has fewer bytes than N, it is padded with null bytes to the right. If the string has more bytes than N, an exception is thrown.
toStringCutToZero(s)
Accepts a String or FixedString argument. Returns the String with the content truncated at the first zero byte found.
Example
Query:
SELECT toFixedString('foo', 8) AS s, toStringCutToZero(s) AS s_cut;
Result:
┌─s─────────────┬─s_cut─┐
│ foo\0\0\0\0\0 │ foo │
└───────────────┴───────┘
Query:
SELECT toFixedString('foo\0bar', 8) AS s, toStringCutToZero(s) AS s_cut;
Result:
┌─s──────────┬─s_cut─┐
│ foo\0bar\0 │ foo │
└────────────┴───────┘
toDecimalString
Converts a numeric value to String with the number of fractional digits in the output specified by the user.
Syntax
toDecimalString(number, scale)
Parameters
-
number
— Value to be represented as String, Int, UInt , Float , Decimal , -
scale
— Number of fractional digits, UInt8 .
Returned value
- Input value represented as String with given number of fractional digits (scale). The number is rounded up or down according to common arithmetic in case requested scale is smaller than original number's scale.
Example
Query:
SELECT toDecimalString(CAST('64.32', 'Float64'), 5);
Result:
┌toDecimalString(CAST('64.32', 'Float64'), 5)─┐
│ 64.32000 │
└─────────────────────────────────────────────┘
reinterpretAsUInt(8 | 16 | 32 | 64)
reinterpretAsInt(8 | 16 | 32 | 64)
reinterpretAsFloat(32 | 64)
reinterpretAsDate
reinterpretAsDateTime
These functions accept a string and interpret the bytes placed at the beginning of the string as a number in host order (little endian). If the string isn’t long enough, the functions work as if the string is padded with the necessary number of null bytes. If the string is longer than needed, the extra bytes are ignored. A date is interpreted as the number of days since the beginning of the Unix Epoch, and a date with time is interpreted as the number of seconds since the beginning of the Unix Epoch.
reinterpretAsString
This function accepts a number or date or date with time and returns a string containing bytes representing the corresponding value in host order (little endian). Null bytes are dropped from the end. For example, a UInt32 type value of 255 is a string that is one byte long.
reinterpretAsFixedString
This function accepts a number or date or date with time and returns a FixedString containing bytes representing the corresponding value in host order (little endian). Null bytes are dropped from the end. For example, a UInt32 type value of 255 is a FixedString that is one byte long.
reinterpretAsUUID
In addition to the UUID functions listed here, there is dedicated UUID function documentation .
Accepts 16 bytes string and returns UUID containing bytes representing the corresponding value in network byte order (big-endian). If the string isn't long enough, the function works as if the string is padded with the necessary number of null bytes to the end. If the string is longer than 16 bytes, the extra bytes at the end are ignored.
Syntax
reinterpretAsUUID(fixed_string)
Arguments
-
fixed_string
— Big-endian byte string. FixedString .
Returned value
- The UUID type value. UUID .
Examples
String to UUID.
Query:
SELECT reinterpretAsUUID(reverse(unhex('000102030405060708090a0b0c0d0e0f')));
Result:
┌─reinterpretAsUUID(reverse(unhex('000102030405060708090a0b0c0d0e0f')))─┐
│ 08090a0b-0c0d-0e0f-0001-020304050607 │
└───────────────────────────────────────────────────────────────────────┘
Going back and forth from String to UUID.
Query:
WITH
generateUUIDv4() AS uuid,
identity(lower(hex(reverse(reinterpretAsString(uuid))))) AS str,
reinterpretAsUUID(reverse(unhex(str))) AS uuid2
SELECT uuid = uuid2;
Result:
┌─equals(uuid, uuid2)─┐
│ 1 │
└─────────────────────┘
reinterpret(x, T)
Uses the same source in-memory bytes sequence for
x
value and reinterprets it to destination type.
Syntax
reinterpret(x, type)
Arguments
-
x
— Any type. -
type
— Destination type. String .
Returned value
- Destination type value.
Examples
Query:
SELECT reinterpret(toInt8(-1), 'UInt8') as int_to_uint,
reinterpret(toInt8(1), 'Float32') as int_to_float,
reinterpret('1', 'UInt32') as string_to_int;
Result:
┌─int_to_uint─┬─int_to_float─┬─string_to_int─┐
│ 255 │ 1e-45 │ 49 │
└─────────────┴──────────────┴───────────────┘
CAST(x, T)
Converts an input value to the specified data type. Unlike the
reinterpret
function,
CAST
tries to present the same value using the new data type. If the conversion can not be done then an exception is raised.