# 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 datos Int8.
  • toInt16(expr) - Convierte a un valor del tipo de datos Int16.
  • toInt32(expr) - Convierte a un valor del tipo de datos Int32.
  • toInt64(expr) - Convierte a un valor del tipo de datos Int64.
  • toInt128(expr) - Convierte a un valor del tipo de datos Int128.
  • toInt256(expr) - Convierte a un valor del tipo de datos Int256.

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 o Int256.
  • 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)─┐
│          32168 │
└─────────────┴───────────────┴─────────────┘

# 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 datos UInt8.
  • toUInt16(expr) - Convierte a un valor del tipo de datos UInt16.
  • toUInt32(expr) - Convierte a un valor del tipo de datos UInt32.
  • toUInt64(expr) - Convierte a un valor del tipo de datos UInt64.
  • toUInt256(expr) - Convierte a un valor del tipo de datos UInt256.

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 o UInt256.
  • 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)─┐
│           32168 │
└──────────────┴────────────────┴──────────────┘

# 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 datos Float32.
  • toFloat64(expr) - Convierte a un valor del tipo de datos Float64.

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 o Float64.
  • 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)─┐
│              168.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:172022-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-30Date                                      │
└────────────┴───────────────────────────────────────────┘
SELECT toDate('2022-12-30') AS x, toTypeName(x)
┌──────────x─┬─toTypeName(toDate('2022-12-30'))─┐
│ 2022-12-30Date                             │
└────────────┴──────────────────────────────────┘
  • 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:582022-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.11Decimal(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 engorrosa toDate(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 │
└───────────────────────────────────────────────────────────┘
Last Updated: Fri Nov 01 2024 09:02:06 GMT+0000