23 KiB
machine_translated | machine_translated_rev | toc_priority | toc_title |
---|---|---|---|
true | f865c9653f |
38 | La Conversion De Type |
Fonctions De Conversion De Type
Problèmes courants des Conversions numériques
Lorsque vous convertissez une valeur d'un type de données à un autre, vous devez vous rappeler que dans le cas courant, il s'agit d'une opération dangereuse qui peut entraîner une perte de données. Une perte de données peut se produire si vous essayez d'ajuster la valeur d'un type de données plus grand à un type de données plus petit, ou si vous convertissez des valeurs entre différents types de données.
ClickHouse a le même comportement que les programmes C++ .
toInt (8/16/32/64)
Convertit une valeur d'entrée en Int type de données. Cette fonction comprend:
toInt8(expr)
— Results in theInt8
type de données.toInt16(expr)
— Results in theInt16
type de données.toInt32(expr)
— Results in theInt32
type de données.toInt64(expr)
— Results in theInt64
type de données.
Paramètre
expr
— Expression renvoyer un nombre ou une chaîne avec la représentation décimale d'un nombre. Les représentations binaires, octales et hexadécimales des nombres ne sont pas prises en charge. Les zéros principaux sont dépouillés.
Valeur renvoyée
Valeur entière dans le Int8
, Int16
, Int32
, ou Int64
type de données.
Fonctions d'utilisation l'arrondi vers zéro, ce qui signifie qu'ils tronquent des chiffres fractionnaires de nombres.
Le comportement des fonctions pour le NaN et Inf arguments est indéfini. Rappelez-vous sur problèmes de conversion numérique, lorsque vous utilisez les fonctions.
Exemple
SELECT toInt64(nan), toInt32(32), toInt16('16'), toInt8(8.8)
┌─────────toInt64(nan)─┬─toInt32(32)─┬─toInt16('16')─┬─toInt8(8.8)─┐
│ -9223372036854775808 │ 32 │ 16 │ 8 │
└──────────────────────┴─────────────┴───────────────┴─────────────┘
toInt (8/16/32/64)OrZero
Il prend un argument de type String et essaie de l'analyser en Int (8 | 16 | 32 | 64). En cas d'échec, renvoie 0.
Exemple
select toInt64OrZero('123123'), toInt8OrZero('123qwe123')
┌─toInt64OrZero('123123')─┬─toInt8OrZero('123qwe123')─┐
│ 123123 │ 0 │
└─────────────────────────┴───────────────────────────┘
toInt (8/16/32/64)OrNull
Il prend un argument de type String et essaie de l'analyser en Int (8 | 16 | 32 | 64). En cas d'échec, renvoie NULL.
Exemple
select toInt64OrNull('123123'), toInt8OrNull('123qwe123')
┌─toInt64OrNull('123123')─┬─toInt8OrNull('123qwe123')─┐
│ 123123 │ ᴺᵁᴸᴸ │
└─────────────────────────┴───────────────────────────┘
toUInt (8/16/32/64)
Convertit une valeur d'entrée en UInt type de données. Cette fonction comprend:
toUInt8(expr)
— Results in theUInt8
type de données.toUInt16(expr)
— Results in theUInt16
type de données.toUInt32(expr)
— Results in theUInt32
type de données.toUInt64(expr)
— Results in theUInt64
type de données.
Paramètre
expr
— Expression renvoyer un nombre ou une chaîne avec la représentation décimale d'un nombre. Les représentations binaires, octales et hexadécimales des nombres ne sont pas prises en charge. Les zéros principaux sont dépouillés.
Valeur renvoyée
Valeur entière dans le UInt8
, UInt16
, UInt32
, ou UInt64
type de données.
Fonctions d'utilisation l'arrondi vers zéro, ce qui signifie qu'ils tronquent des chiffres fractionnaires de nombres.
Le comportement des fonctions pour les agruments négatifs et pour le NaN et Inf arguments est indéfini. Si vous passez une chaîne avec un nombre négatif, par exemple '-32'
, ClickHouse soulève une exception. Rappelez-vous sur problèmes de conversion numérique, lorsque vous utilisez les fonctions.
Exemple
SELECT toUInt64(nan), toUInt32(-32), toUInt16('16'), toUInt8(8.8)
┌───────toUInt64(nan)─┬─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
jour
toDateOrZero
toDateOrNull
toDateTime
toDateTimeOrZero
toDateTimeOrNull
toDecimal (32/64/128)
Convertir value
à l' Décimal type de données avec précision de S
. Le value
peut être un nombre ou une chaîne. Le S
(l'échelle) paramètre spécifie le nombre de décimales.
toDecimal32(value, S)
toDecimal64(value, S)
toDecimal128(value, S)
toDecimal (32/64/128) OrNull
Convertit une chaîne d'entrée en Nullable (Décimal (P, S)) valeur de type de données. Cette famille de fonctions comprennent:
toDecimal32OrNull(expr, S)
— Results inNullable(Decimal32(S))
type de données.toDecimal64OrNull(expr, S)
— Results inNullable(Decimal64(S))
type de données.toDecimal128OrNull(expr, S)
— Results inNullable(Decimal128(S))
type de données.
Ces fonctions devraient être utilisées à la place de toDecimal*()
fonctions, si vous préférez obtenir un NULL
la valeur au lieu d'une exception dans le cas d'une valeur d'entrée erreur d'analyse.
Paramètre
expr
— Expression, retourne une valeur dans l' Chaîne type de données. ClickHouse attend la représentation textuelle du nombre décimal. Exemple,'1.111'
.S
— Scale, the number of decimal places in the resulting value.
Valeur renvoyée
Une valeur dans l' Nullable(Decimal(P,S))
type de données. La valeur contient:
- Numéro
S
décimales, si ClickHouse interprète la chaîne d'entrée comme un nombre. NULL
si ClickHouse ne peut pas interpréter la chaîne d'entrée comme un nombre ou si le nombre d'entrée contient plus deS
décimale.
Exemple
SELECT toDecimal32OrNull(toString(-1.111), 5) AS val, toTypeName(val)
┌──────val─┬─toTypeName(toDecimal32OrNull(toString(-1.111), 5))─┐
│ -1.11100 │ Nullable(Decimal(9, 5)) │
└──────────┴────────────────────────────────────────────────────┘
SELECT toDecimal32OrNull(toString(-1.111), 2) AS val, toTypeName(val)
┌──val─┬─toTypeName(toDecimal32OrNull(toString(-1.111), 2))─┐
│ ᴺᵁᴸᴸ │ Nullable(Decimal(9, 2)) │
└──────┴────────────────────────────────────────────────────┘
toDecimal (32/64/128)OrZero
Convertit une valeur d'entrée en Decimal(P,S) type de données. Cette famille de fonctions comprennent:
toDecimal32OrZero( expr, S)
— Results inDecimal32(S)
type de données.toDecimal64OrZero( expr, S)
— Results inDecimal64(S)
type de données.toDecimal128OrZero( expr, S)
— Results inDecimal128(S)
type de données.
Ces fonctions devraient être utilisées à la place de toDecimal*()
fonctions, si vous préférez obtenir un 0
la valeur au lieu d'une exception dans le cas d'une valeur d'entrée erreur d'analyse.
Paramètre
expr
— Expression, retourne une valeur dans l' Chaîne type de données. ClickHouse attend la représentation textuelle du nombre décimal. Exemple,'1.111'
.S
— Scale, the number of decimal places in the resulting value.
Valeur renvoyée
Une valeur dans l' Nullable(Decimal(P,S))
type de données. La valeur contient:
- Numéro
S
décimales, si ClickHouse interprète la chaîne d'entrée comme un nombre. - 0 avec
S
décimales, si ClickHouse ne peut pas interpréter la chaîne d'entrée comme un nombre ou si le nombre d'entrée contient plus deS
décimale.
Exemple
SELECT toDecimal32OrZero(toString(-1.111), 5) AS val, toTypeName(val)
┌──────val─┬─toTypeName(toDecimal32OrZero(toString(-1.111), 5))─┐
│ -1.11100 │ Decimal(9, 5) │
└──────────┴────────────────────────────────────────────────────┘
SELECT toDecimal32OrZero(toString(-1.111), 2) AS val, toTypeName(val)
┌──val─┬─toTypeName(toDecimal32OrZero(toString(-1.111), 2))─┐
│ 0.00 │ Decimal(9, 2) │
└──────┴────────────────────────────────────────────────────┘
toString
Fonctions de conversion entre des nombres, des chaînes (mais pas des chaînes fixes), des dates et des dates avec des heures. Toutes ces fonctions acceptent un argument.
Lors de la conversion vers ou à partir d'une chaîne, la valeur est formatée ou analysée en utilisant les mêmes règles que pour le format TabSeparated (et presque tous les autres formats de texte). Si la chaîne ne peut pas être analysée, une exception est levée et la demande est annulée.
Lors de la conversion de dates en nombres ou vice versa, la date correspond au nombre de jours depuis le début de L'époque Unix. Lors de la conversion de dates avec des heures en nombres ou vice versa, la date avec l'heure correspond au nombre de secondes depuis le début de L'époque Unix.
Les formats date et date-avec-heure pour les fonctions toDate/toDateTime sont définis comme suit:
YYYY-MM-DD
YYYY-MM-DD hh:mm:ss
À titre d'exception, si vous convertissez des types numériques UInt32, Int32, UInt64 ou Int64 à Date, et si le nombre est supérieur ou égal à 65536, le nombre est interprété comme un horodatage Unix (et non comme le nombre de jours) et est arrondi à la date. Cela permet de prendre en charge l'occurrence commune de l'écriture ‘toDate(unix_timestamp)’, qui autrement serait une erreur et nécessiterait d'écrire le plus lourd ‘toDate(toDateTime(unix_timestamp))’.
La Conversion entre une date et une date avec l'heure est effectuée de manière naturelle: en ajoutant une heure nulle ou en supprimant l'heure.
La Conversion entre types numériques utilise les mêmes règles que les affectations entre différents types numériques en C++.
De plus, la fonction ToString de L'argument DateTime peut prendre un deuxième argument de chaîne contenant le nom du fuseau horaire. Exemple: Asia/Yekaterinburg
Dans ce cas, l'heure est formatée en fonction du fuseau horaire spécifié.
SELECT
now() AS now_local,
toString(now(), 'Asia/Yekaterinburg') AS now_yekat
┌───────────now_local─┬─now_yekat───────────┐
│ 2016-06-15 00:11:21 │ 2016-06-15 02:11:21 │
└─────────────────────┴─────────────────────┘
Voir aussi l' toUnixTimestamp
fonction.
toFixedString (s, N)
Convertit un argument de type String en un type FixedString (N) (une chaîne de longueur fixe N). N doit être une constante. Si la chaîne a moins d'octets que N, elle est passée avec des octets null à droite. Si la chaîne a plus d'octets que N, une exception est levée.
toStringCutToZero(s)
Accepte un argument String ou FixedString. Renvoie la chaîne avec le contenu tronqué au premier octet zéro trouvé.
Exemple:
SELECT toFixedString('foo', 8) AS s, toStringCutToZero(s) AS s_cut
┌─s─────────────┬─s_cut─┐
│ foo\0\0\0\0\0 │ foo │
└───────────────┴───────┘
SELECT toFixedString('foo\0bar', 8) AS s, toStringCutToZero(s) AS s_cut
┌─s──────────┬─s_cut─┐
│ foo\0bar\0 │ foo │
└────────────┴───────┘
reinterpretAsUInt (8/16/32/64)
reinterpretAsInt (8/16/32/64)
reinterpretAsFloat (32/64)
réinterprétasdate
reinterpretAsDateTime
Ces fonctions acceptent une chaîne et interprètent les octets placés au début de la chaîne comme un nombre dans l'ordre de l'hôte (little endian). Si la chaîne n'est pas assez longue, les fonctions fonctionnent comme si la chaîne était remplie avec le nombre nécessaire d'octets nuls. Si la chaîne est plus longue que nécessaire, les octets supplémentaires sont ignorés. Une date est interprétée comme le nombre de jours depuis le début de l'Époque Unix, et une date avec le temps, est interprété comme le nombre de secondes écoulées depuis le début de l'Époque Unix.
reinterpretAsString
Cette fonction accepte un nombre ou une date ou une date avec l'heure, et renvoie une chaîne contenant des octets représentant la valeur correspondante dans l'ordre de l'hôte (little endian). Les octets nuls sont supprimés de la fin. Par exemple, une valeur de type uint32 de 255 est une chaîne longue d'un octet.
reinterpretAsFixedString
Cette fonction accepte un nombre ou une date ou une date avec l'heure, et renvoie une chaîne fixe contenant des octets représentant la valeur correspondante dans l'ordre de l'hôte (little endian). Les octets nuls sont supprimés de la fin. Par exemple, une valeur de type uint32 de 255 est une chaîne fixe longue d'un octet.
CAST (x, t)
Convertir ‘x’ à l' ‘t’ type de données. La syntaxe CAST (X comme t) est également prise en charge.
Exemple:
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
┌─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\0\0\0 │
└─────────────────────┴─────────────────────┴────────────┴─────────────────────┴───────────────────────────┘
La Conversion en FixedString (N) ne fonctionne que pour les arguments de type String ou FixedString (N).
Type conversion en Nullable et le dos est pris en charge. Exemple:
SELECT toTypeName(x) FROM t_null
┌─toTypeName(x)─┐
│ Int8 │
│ Int8 │
└───────────────┘
SELECT toTypeName(CAST(x, 'Nullable(UInt16)')) FROM t_null
┌─toTypeName(CAST(x, 'Nullable(UInt16)'))─┐
│ Nullable(UInt16) │
│ Nullable(UInt16) │
└─────────────────────────────────────────┘
toInterval (année / trimestre / Mois / Semaine / Jour / Heure / Minute / Seconde)
Convertit un argument de type Number en Intervalle type de données.
Syntaxe
toIntervalSecond(number)
toIntervalMinute(number)
toIntervalHour(number)
toIntervalDay(number)
toIntervalWeek(number)
toIntervalMonth(number)
toIntervalQuarter(number)
toIntervalYear(number)
Paramètre
number
— Duration of interval. Positive integer number.
Valeurs renvoyées
- La valeur de
Interval
type de données.
Exemple
WITH
toDate('2019-01-01') AS date,
INTERVAL 1 WEEK AS interval_week,
toIntervalWeek(1) AS interval_to_week
SELECT
date + interval_week,
date + interval_to_week
┌─plus(date, interval_week)─┬─plus(date, interval_to_week)─┐
│ 2019-01-08 │ 2019-01-08 │
└───────────────────────────┴──────────────────────────────┘
parseDateTimeBestEffort
Convertit une date et une heure dans le Chaîne la représentation de DateTime type de données.
La fonction d'analyse ISO 8601, RFC 1123 - 5.2.14 RFC-822 date et heure Spécification, ClickHouse et d'autres formats de date et d'heure.
Syntaxe
parseDateTimeBestEffort(time_string [, time_zone]);
Paramètre
time_string
— String containing a date and time to convert. Chaîne.time_zone
— Time zone. The function parsestime_string
selon le fuseau horaire. Chaîne.
Formats non standard pris en charge
- Une chaîne contenant 9..10 chiffres le timestamp unix.
- Une chaîne avec une date et une heure composant:
YYYYMMDDhhmmss
,DD/MM/YYYY hh:mm:ss
,DD-MM-YY hh:mm
,YYYY-MM-DD hh:mm:ss
, etc. - Une chaîne avec une date, mais pas de composant de temps:
YYYY
,YYYYMM
,YYYY*MM
,DD/MM/YYYY
,DD-MM-YY
etc. - Une chaîne avec un jour et une heure:
DD
,DD hh
,DD hh:mm
. Dans ce casYYYY-MM
sont substitués comme suit2000-01
. - Une chaîne qui inclut la date et l'heure ainsi que des informations de décalage de fuseau horaire:
YYYY-MM-DD hh:mm:ss ±h:mm
, etc. Exemple,2020-12-12 17:36:00 -5:00
.
Pour tous les formats avec séparateur, la fonction analyse les noms de mois exprimés par leur nom complet ou par les trois premières lettres d'un nom de mois. Exemple: 24/DEC/18
, 24-Dec-18
, 01-September-2018
.
Valeur renvoyée
time_string
converti à l'DateTime
type de données.
Exemple
Requête:
SELECT parseDateTimeBestEffort('12/12/2020 12:12:57')
AS parseDateTimeBestEffort;
Résultat:
┌─parseDateTimeBestEffort─┐
│ 2020-12-12 12:12:57 │
└─────────────────────────┘
Requête:
SELECT parseDateTimeBestEffort('Sat, 18 Aug 2018 07:22:16 GMT', 'Europe/Moscow')
AS parseDateTimeBestEffort
Résultat:
┌─parseDateTimeBestEffort─┐
│ 2018-08-18 10:22:16 │
└─────────────────────────┘
Requête:
SELECT parseDateTimeBestEffort('1284101485')
AS parseDateTimeBestEffort
Résultat:
┌─parseDateTimeBestEffort─┐
│ 2015-07-07 12:04:41 │
└─────────────────────────┘
Requête:
SELECT parseDateTimeBestEffort('2018-12-12 10:12:12')
AS parseDateTimeBestEffort
Résultat:
┌─parseDateTimeBestEffort─┐
│ 2018-12-12 10:12:12 │
└─────────────────────────┘
Requête:
SELECT parseDateTimeBestEffort('10 20:19')
Résultat:
┌─parseDateTimeBestEffort('10 20:19')─┐
│ 2000-01-10 20:19:00 │
└─────────────────────────────────────┘
Voir Aussi
-
ISO 8601 announcement by @xkcd
- RFC 1123
- jour
- toDateTime
parseDateTimeBestEffortOrNull
De même que pour parseDateTimeBestEffort sauf qu'il renvoie null lorsqu'il rencontre un format de date qui ne peut pas être traité.
parseDateTimeBestEffortOrZero
De même que pour parseDateTimeBestEffort sauf qu'il renvoie une date zéro ou une date zéro lorsqu'il rencontre un format de date qui ne peut pas être traité.