# Funciones de conversión de tipos
# toInt
Convierte un valor de entrada a un valor del tipo de datos Int. Esta familia de funciones incluye:
toInt8(expr)
- Convierte a un valor del tipo de datosInt8
.toInt16(expr)
- Convierte a un valor del tipo de datosInt16
.toInt32(expr)
- Convierte a un valor del tipo de datosInt32
.toInt64(expr)
- Convierte a un valor del tipo de datosInt64
.toInt128(expr)
- Convierte a un valor del tipo de datosInt128
.toInt256(expr)
- Convierte a un valor del tipo de datosInt256
.
Argumentos
expr
- Expresión que devuelve un número o una cadena con la representación decimal de un número. No se admiten representaciones binarias, octales y hexadecimales. Se eliminan los ceros iniciales.
Valor devuelto
- Valor entero en el tipo de datos
Int8
,Int16
,Int32
,Int64
,Int128
oInt256
. - Las funciones utilizan el redondeo hacia cero, lo que significa que se truncan los dígitos fraccionarios de los números.
- El comportamiento de las funciones para los argumentos NaN e Inf es indefinido. Recuerde los problemas de conversión numérica al utilizar las funciones.
Ejemplo
SELECT toInt32(32), toInt16('16'), toInt8(8.8);
┌─toInt32(32)─┬─toInt16('16')─┬─toInt8(8.8)─┐
│ 32 │ 16 │ 8 │
└─────────────┴───────────────┴─────────────┘
# toUInt
Convierte un valor de entrada al tipo de datos UInt. Esta familia de funciones incluye:
toUInt8(expr)
- Convierte a un valor del tipo de datosUInt8
.toUInt16(expr)
- Convierte a un valor del tipo de datosUInt16
.toUInt32(expr)
- Convierte a un valor del tipo de datosUInt32
.toUInt64(expr)
- Convierte a un valor del tipo de datosUInt64
.toUInt256(expr)
- Convierte a un valor del tipo de datosUInt256
.
Argumentos
expr
- Expresión que devuelve un número o una cadena con la representación decimal de un número. No se admiten representaciones binarias, octales y hexadecimales. Se eliminan los ceros iniciales.
Valor devuelto
- Valor entero en el tipo de datos
UInt8
,UInt16
,UInt32
,UInt64
oUInt256
. - Las funciones utilizan el redondeo hacia cero, lo que significa que se truncan los dígitos fraccionarios de los números.
- El comportamiento de las funciones para argumentos negativos y para los argumentos NaN e Inf es indefinido. Si pasa una cadena con un número negativo, por ejemplo
'-32'
, ClickHouse genera una excepción. Recuerde los problemas de conversión numérica al utilizar las funciones.
Ejemplo
SELECT toUInt32(32), toUInt16('16'), toUInt8(8.8);
┌─toUInt32(32)─┬─toUInt16('16')─┬─toUInt8(8.8)─┐
│ 32 │ 16 │ 8 │
└──────────────┴────────────────┴──────────────┘
# toFloat
Convierte un valor de entrada al tipo de datos Float. Esta familia de funciones incluye:
toFloat32(expr)
- Convierte a un valor del tipo de datosFloat32
.toFloat64(expr)
- Convierte a un valor del tipo de datosFloat64
.
Argumentos
expr
- Expresión que devuelve un número o una cadena con la representación decimal de un número. No se admiten representaciones binarias, octales y hexadecimales. Se eliminan los ceros iniciales.
Valor devuelto
- Valor de punto flotante en el tipo de datos
Float32
oFloat64
. - Las funciones utilizan el redondeo hacia cero, lo que significa que se truncan los dígitos fraccionarios de los números.
- El comportamiento de las funciones para los argumentos NaN e Inf es indefinido. Recuerde los problemas de conversión numérica al utilizar las funciones.
Ejemplo
SELECT toFloat32('16'), toFloat64(8.8);
┌─toFloat32('16')─┬─toFloat64(8.8)─┐
│ 16 │ 8.8 │
└─────────────────┴────────────────┘
# toDate
Convierte el argumento al tipo de datos Date. Si el argumento es DateTime o DateTime64, lo trunca y deja el componente de fecha del DateTime:
SELECT now() AS x, toDate(x)
┌───────────────────x─┬─toDate(now())─┐
│ 2022-12-30 13:44:17 │ 2022-12-30 │
└─────────────────────┴───────────────┘
Ejemplos
- Si el argumento es una cadena, se analiza como Date o DateTime. Si se analizó como DateTime, se utiliza el componente de fecha:
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 │
└────────────┴──────────────────────────────────┘
- Si el argumento es un número y parece un timestamp de UNIX (es mayor que 65535), se interpreta como DateTime, luego se trunca a Date en la zona horaria actual. El argumento de la zona horaria se puede especificar como segundo argumento de la función. La truncación a Date depende de la zona horaria:
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
El ejemplo anterior muestra cómo el mismo timestamp de UNIX puede interpretarse como diferentes fechas en diferentes zonas horarias.
Si el argumento es un número y es menor que 65536, se interpreta como el número de días desde 1970-01-01 (el primer día de UNIX) y se convierte a Date. Corresponde a la representación numérica interna del tipo de datos
Date
. Ejemplo:SELECT toDate(12345)
┌─toDate(12345)─┐ │ 2003-10-20 │ └───────────────┘
Esta conversión no depende de las zonas horarias.
Si el argumento no cabe en el rango del tipo de datos Date, el resultado es un comportamiento definido por la implementación, que puede saturarse hasta la fecha máxima admitida o desbordarse:
SELECT toDate(10000000000.)
┌─toDate(10000000000.)─┐ │ 2106-02-07 │ └──────────────────────┘
La función
toDate
también se puede escribir en formas alternativas:SELECT now() AS time, toDate(time)
┌──────────time───────┬─────toDate(now()───┐ │ 2022-12-30 13:54:58 │ 2022-12-30 │ └─────────────────────┴────────────────────┘
# toDateTime64
Convierte el argumento al tipo de datos DateTime64.
toDateTime64(expr, scale, [timezone])
Argumentos
expr
- El valor. Cadena, UInt32, Float o DateTime.scale
- Tamaño del tick (precisión): 10 segundos. Rango válido: [ 0 : 9 ].- precisión
timezone
- Zona horaria del objeto datetime64 especificado. Opcional.
Valor devuelto
- Una fecha del calendario y hora del día, con precisión de sub-segundos.
- Tipo: DateTime64.
Ejemplo
El valor está dentro del rango:
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) │ └─────────────────────────┴─────────────────────────────────────────────────────────┘
Como decimal con precisión:
SELECT toDateTime64(1546300800.000, 3) AS value, toTypeName(value);
┌───────────────────value─┬─toTypeName(toDateTime64(1546300800., 3)) ─┐ │ 2019-01-01 00:00:00.000 │ DateTime64(3) │ └─────────────────────────┴───────────────────────────────────────────┘
Sin el punto decimal, el valor todavía se trata como un timestamp de Unix en segundos:
SELECT toDateTime64(1546300800000, 3) AS value, toTypeName(value);
┌───────────────────value─┬─toTypeName(toDateTime64(1546300800000, 3))─┐ │ 2299-12-31 23:59:59.000 │ DateTime64(3) │ └─────────────────────────┴────────────────────────────────────────────┘
Con
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
Convierte value
al tipo de datos Decimal (opens new window) con una precisión de S
. El value
puede ser un número o una cadena. El parámetro S
(escala) especifica el número de lugares decimales.
toDecimal32(value, S)
toDecimal64(value, S)
toDecimal128(value, S)
toDecimal256(value, S)
Argumentos
expr
- Expresión, devuelve un valor en el tipo de datos String. ClickHouse espera la representación textual del número decimal. Por ejemplo,'1.111'
.S
- Escala, el número de lugares decimales en el valor resultante.
Valor devuelto
- Un valor en el tipo de datos
(Decimal(P,S))
. El valor contiene: - Número con
S
lugares decimales, si ClickHouse interpreta la cadena de entrada como un número.
Ejemplos
SELECT toDecimal32(toString(1.111), 2) AS val, toTypeName(val);
┌──val─┬─toTypeName(toDecimal32(toString(1.111), 2))─┐
│ 1.11 │ Decimal(9, 2) │
└──────┴─────────────────────────────────────────────┘
# toString
Funciones para convertir entre números, cadenas (pero no cadenas fijas), fechas y fechas con horas. Todas estas funciones aceptan un argumento.
- Al convertir a o desde una cadena, el valor se formatea o analiza utilizando las mismas reglas que para el formato TabSeparated (y casi todos los demás formatos de texto). Si la cadena no se puede analizar, se genera una excepción y se cancela la solicitud.
- Al convertir fechas a números o viceversa, la fecha corresponde al número de días desde el comienzo de la época de Unix. Al convertir fechas con horas a números o viceversa, la fecha con hora corresponde al número de segundos desde el comienzo de la época de Unix.
- Los formatos de fecha y fecha con hora para las funciones toDate/toDateTime se definen de la siguiente manera:
YYYY-MM-DDYYYY-MM-DD hh:mm:ss
- Como excepción, al convertir de los tipos numéricos UInt32, Int32, UInt64 o Int64 a Date, y si el número es mayor o igual a 65536, el número se interpreta como una marca de tiempo de Unix (y no como el número de días) y se redondea a la fecha. Esto permite admitir la ocurrencia común de escribir
toDate(unix_timestamp)
, que de lo contrario sería un error y requeriría escribir la forma más engorrosatoDate(toDateTime(unix_timestamp))
. - La conversión entre una fecha y una fecha con hora se realiza de forma natural: agregando una hora nula o eliminando la hora.
- La conversión entre tipos numéricos utiliza las mismas reglas que las asignaciones entre diferentes tipos numéricos en C++.
Ejemplo
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()
Convierte una cadena en DateTime según una cadena de formato de MySQL. Esta función es la operación opuesta de la función formatDateTime.
parseDateTime(str, format[, timezone])
Argumentos
str
- La cadena que se va a analizar.format
- La cadena de formato.timezone
- Zona horaria. Opcional.
Valor devuelto
- Devuelve valores DateTime analizados a partir de la cadena de entrada según una cadena de formato de estilo MySQL.
Especificadores de formato admitidos
- Todos los especificadores de formato enumerados en formatDateTime excepto:
- %Q: Trimestre (1-4)
Ejemplo
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 │
└───────────────────────────────────────────────────────────┘