# Typumwandlungsfunktionen
# toInt
Konvertiert einen Eingabewert in den Datentyp Int. Diese Funktionenfamilie umfasst:
toInt8(expr)
- Konvertiert in einen Wert des DatentypsInt8
.toInt16(expr)
- Konvertiert in einen Wert des DatentypsInt16
.toInt32(expr)
- Konvertiert in einen Wert des DatentypsInt32
.toInt64(expr)
- Konvertiert in einen Wert des DatentypsInt64
.toInt128(expr)
- Konvertiert in einen Wert des DatentypsInt128
.toInt256(expr)
- Konvertiert in einen Wert des DatentypsInt256
.
Argumente
expr
- Ausdruck, der eine Zahl oder eine Zeichenkette mit der Dezimaldarstellung einer Zahl zurückgibt. Binäre, oktale und hexadezimale Darstellungen von Zahlen werden nicht unterstützt. Führende Nullen werden entfernt.
Rückgabewert
- Ganzzahliger Wert im Datentyp
Int8
,Int16
,Int32
,Int64
,Int128
oderInt256
. - Die Funktionen verwenden das Runden gegen Null, d.h. sie kürzen die Nachkommastellen von Zahlen ab.
- Das Verhalten der Funktionen für die Argumente NaN und Inf ist undefiniert. Beachten Sie bei der Verwendung der Funktionen die Probleme bei numerischen Konvertierungen.
Beispiel
SELECT toInt32(32), toInt16('16'), toInt8(8.8);
┌─toInt32(32)─┬─toInt16('16')─┬─toInt8(8.8)─┐
│ 32 │ 16 │ 8 │
└─────────────┴───────────────┴─────────────┘
# toUInt
Konvertiert einen Eingabewert in den Datentyp UInt. Diese Funktionenfamilie umfasst:
toUInt8(expr)
- Konvertiert in einen Wert des DatentypsUInt8
.toUInt16(expr)
- Konvertiert in einen Wert des DatentypsUInt16
.toUInt32(expr)
- Konvertiert in einen Wert des DatentypsUInt32
.toUInt64(expr)
- Konvertiert in einen Wert des DatentypsUInt64
.toUInt256(expr)
- Konvertiert in einen Wert des DatentypsUInt256
.
Argumente
expr
- Ausdruck, der eine Zahl oder eine Zeichenkette mit der Dezimaldarstellung einer Zahl zurückgibt. Binäre, oktale und hexadezimale Darstellungen von Zahlen werden nicht unterstützt. Führende Nullen werden entfernt.
Rückgabewert
- Ganzzahliger Wert im Datentyp
UInt8
,UInt16
,UInt32
,UInt64
oderUInt256
. - Die Funktionen verwenden das Runden gegen Null, d.h. sie kürzen die Nachkommastellen von Zahlen ab.
- Das Verhalten der Funktionen für negative Argumente und für die Argumente NaN und Inf ist undefiniert. Wenn Sie eine Zeichenkette mit einer negativen Zahl übergeben, z.B.
'-32'
, löst ClickHouse eine Ausnahme aus. Beachten Sie bei der Verwendung der Funktionen die Probleme bei numerischen Konvertierungen.
Beispiel
SELECT toUInt32(32), toUInt16('16'), toUInt8(8.8);
┌─toUInt32(32)─┬─toUInt16('16')─┬─toUInt8(8.8)─┐
│ 32 │ 16 │ 8 │
└──────────────┴────────────────┴──────────────┘
# toFloat
Konvertiert einen Eingabewert in den Datentyp Float. Diese Funktionenfamilie umfasst:
toFloat32(expr)
- Konvertiert in einen Wert des DatentypsFloat32
.toFloat64(expr)
- Konvertiert in einen Wert des DatentypsFloat64
.
Argumente
expr
- Ausdruck, der eine Zahl oder eine Zeichenkette mit der Dezimaldarstellung einer Zahl zurückgibt. Binäre, oktale und hexadezimale Darstellungen von Zahlen werden nicht unterstützt. Führende Nullen werden entfernt.
Rückgabewert
- Fließkommawert im Datentyp
Float32
oderFloat64
. - Die Funktionen verwenden das Runden gegen Null, d.h. sie kürzen die Nachkommastellen von Zahlen ab.
- Das Verhalten der Funktionen für die Argumente NaN und Inf ist undefiniert. Beachten Sie bei der Verwendung der Funktionen die Probleme bei numerischen Konvertierungen.
Beispiel
SELECT toFloat32('16'), toFloat64(8.8);
┌─toFloat32('16')─┬─toFloat64(8.8)─┐
│ 16 │ 8.8 │
└─────────────────┴────────────────┘
# toDate
Konvertiert das Argument in den Datentyp Date. Wenn das Argument DateTime oder DateTime64 ist, wird es abgeschnitten und der Datumsbestandteil des DateTime bleibt erhalten:
SELECT now() AS x, toDate(x)
┌───────────────────x─┬─toDate(now())─┐
│ 2022-12-30 13:44:17 │ 2022-12-30 │
└─────────────────────┴───────────────┘
Beispiele
- Wenn das Argument ein String ist, wird es als Date oder DateTime interpretiert. Wenn es als DateTime interpretiert wurde, wird der Datumsbestandteil verwendet:
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 │
└────────────┴──────────────────────────────────┘
- Wenn das Argument eine Zahl ist und wie ein UNIX-Zeitstempel aussieht (größer als 65535), wird es als DateTime interpretiert und auf Date in der aktuellen Zeitzone abgeschnitten. Das Zeitzone-Argument kann als zweites Argument der Funktion angegeben werden. Der Abschnitt auf Date hängt von der Zeitzone ab:
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
Das obige Beispiel zeigt, wie der gleiche UNIX-Zeitstempel in verschiedenen Zeitzonen als unterschiedliche Daten interpretiert werden kann.
Wenn das Argument eine Zahl ist und kleiner als 65536 ist, wird es als Anzahl der Tage seit dem 01.01.1970 (dem ersten UNIX-Tag) interpretiert und in Date konvertiert. Es entspricht der internen numerischen Darstellung des Datentyps
Date
. Beispiel:SELECT toDate(12345)
┌─toDate(12345)─┐ │ 2003-10-20 │ └───────────────┘
Diese Konvertierung hängt nicht von Zeitzonen ab.
Wenn das Argument nicht in den Bereich des Datentyps Date passt, ergibt sich ein implementationsabhängiges Verhalten, das auf das maximale unterstützte Datum oder einen Überlauf gesättigt sein kann:
SELECT toDate(10000000000.)
┌─toDate(10000000000.)─┐ │ 2106-02-07 │ └──────────────────────┘
Die Funktion
toDate
kann auch in alternativen Formen geschrieben werden:SELECT now() AS time, toDate(time)
┌──────────time───────┬─────toDate(now()───┐ │ 2022-12-30 13:54:58 │ 2022-12-30 │ └─────────────────────┴────────────────────┘
# toDateTime64
Konvertiert das Argument in den Datentyp DateTime64.
toDateTime64(expr, scale, [timezone])
Argumente
expr
- Der Wert. String, UInt32, Float oder DateTime.scale
- Tickgröße (Präzision): 10 Sekunden. Gültiger Bereich: [ 0 : 9 ].- Präzision
timezone
- Zeitzone des angegebenen DateTime64-Objekts.
Rückgabewert
- Ein Kalenderdatum und eine Tageszeit mit Untersekunden-Genauigkeit.
- Typ: DateTime64.
Beispiel
Der Wert liegt im Bereich:
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) │ └─────────────────────────┴─────────────────────────────────────────────────────────┘
Als Dezimalzahl mit Präzision:
SELECT toDateTime64(1546300800.000, 3) AS value, toTypeName(value);
┌───────────────────value─┬─toTypeName(toDateTime64(1546300800., 3)) ─┐ │ 2019-01-01 00:00:00.000 │ DateTime64(3) │ └─────────────────────────┴───────────────────────────────────────────┘
Ohne den Dezimalpunkt wird der Wert immer noch als Unix-Zeitstempel in Sekunden behandelt:
SELECT toDateTime64(1546300800000, 3) AS value, toTypeName(value);
┌───────────────────value─┬─toTypeName(toDateTime64(1546300800000, 3))─┐ │ 2299-12-31 23:59:59.000 │ DateTime64(3) │ └─────────────────────────┴────────────────────────────────────────────┘
Mit
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
Konvertiert value
in den Datentyp Decimal (opens new window) mit einer Genauigkeit von S
. Der value
kann eine Zahl oder eine Zeichenkette sein. Der Parameter S
(Skala) gibt die Anzahl der Dezimalstellen an.
toDecimal32(value, S)
toDecimal64(value, S)
toDecimal128(value, S)
toDecimal256(value, S)
Argumente
expr
- Ausdruck, der einen Wert im Datentyp String zurückgibt. ClickHouse erwartet die textuelle Darstellung der Dezimalzahl. Zum Beispiel'1.111'
.S
- Skala, die Anzahl der Dezimalstellen im resultierenden Wert.
Rückgabewert
- Ein Wert im Datentyp
(Decimal(P,S))
. Der Wert enthält: - Zahl mit
S
Dezimalstellen, wenn ClickHouse die Eingabezeichenkette als Zahl interpretiert.
Beispiele
SELECT toDecimal32(toString(1.111), 2) AS val, toTypeName(val);
┌──val─┬─toTypeName(toDecimal32(toString(1.111), 2))─┐
│ 1.11 │ Decimal(9, 2) │
└──────┴─────────────────────────────────────────────┘
# toString
Funktionen zum Konvertieren zwischen Zahlen, Zeichenketten (aber nicht festen Zeichenketten), Daten und Daten mit Uhrzeiten. Alle diese Funktionen akzeptieren ein Argument.
- Bei der Konvertierung in oder aus einer Zeichenkette wird der Wert gemäß den gleichen Regeln formatiert oder analysiert wie im TabSeparated-Format (und fast allen anderen Textformaten). Wenn die Zeichenkette nicht analysiert werden kann, wird eine Ausnahme ausgelöst und die Anfrage abgebrochen.
- Bei der Konvertierung von Daten in Zahlen oder umgekehrt entspricht das Datum der Anzahl der Tage seit Beginn der Unix-Epoche. Bei der Konvertierung von Daten mit Uhrzeiten in Zahlen oder umgekehrt entspricht das Datum mit Uhrzeit der Anzahl der Sekunden seit Beginn der Unix-Epoche.
- Die Datums- und Datums-mit-Uhrzeit-Formate für die Funktionen toDate/toDateTime sind wie folgt definiert:
YYYY-MM-DDYYYY-MM-DD hh:mm:ss
- Als Ausnahme wird beim Konvertieren von UInt32, Int32, UInt64 oder Int64 numerischen Typen in Date und wenn die Zahl größer oder gleich 65536 ist, die Zahl als Unix-Zeitstempel interpretiert (und nicht als Anzahl der Tage) und auf das Datum gerundet. Dadurch wird die häufige Verwendung von
toDate(unix_timestamp)
unterstützt, was sonst ein Fehler wäre und das umständlicheretoDate(toDateTime(unix_timestamp))
erfordern würde. - Die Konvertierung zwischen einem Datum und einem Datum mit Uhrzeit erfolgt auf natürliche Weise: durch Hinzufügen einer Nullzeit oder das Weglassen der Zeit.
- Die Konvertierung zwischen numerischen Typen verwendet die gleichen Regeln wie Zuweisungen zwischen verschiedenen numerischen Typen in C++.
Beispiel
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()
Konvertiert eine Zeichenkette in DateTime gemäß einem MySQL-Formatstring. Diese Funktion ist die umgekehrte Operation der Funktion formatDateTime.
parseDateTime(str, format[, timezone])
Argumente
str
- die zu analysierende Zeichenketteformat
- der Formatstringtimezone
- Zeitzone. Optional.
Rückgabewert(e)
- Gibt DateTime-Werte zurück, die aus der Eingabezeichenkette gemäß einem MySQL-Formatstring analysiert wurden.
Unterstützte Format-Spezifikatoren
- Alle im Formatstring formatDateTime aufgelisteten Format-Spezifikatoren außer:
- %Q: Quartal (1-4)
Beispiel
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 │
└───────────────────────────────────────────────────────────┘