# Typumwandlungsfunktionen

# toInt

Konvertiert einen Eingabewert in den Datentyp Int. Diese Funktionenfamilie umfasst:

  • toInt8(expr) - Konvertiert in einen Wert des Datentyps Int8.
  • toInt16(expr) - Konvertiert in einen Wert des Datentyps Int16.
  • toInt32(expr) - Konvertiert in einen Wert des Datentyps Int32.
  • toInt64(expr) - Konvertiert in einen Wert des Datentyps Int64.
  • toInt128(expr) - Konvertiert in einen Wert des Datentyps Int128.
  • toInt256(expr) - Konvertiert in einen Wert des Datentyps Int256.

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

# toUInt

Konvertiert einen Eingabewert in den Datentyp UInt. Diese Funktionenfamilie umfasst:

  • toUInt8(expr) - Konvertiert in einen Wert des Datentyps UInt8.
  • toUInt16(expr) - Konvertiert in einen Wert des Datentyps UInt16.
  • toUInt32(expr) - Konvertiert in einen Wert des Datentyps UInt32.
  • toUInt64(expr) - Konvertiert in einen Wert des Datentyps UInt64.
  • toUInt256(expr) - Konvertiert in einen Wert des Datentyps UInt256.

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

# toFloat

Konvertiert einen Eingabewert in den Datentyp Float. Diese Funktionenfamilie umfasst:

  • toFloat32(expr) - Konvertiert in einen Wert des Datentyps Float32.
  • toFloat64(expr) - Konvertiert in einen Wert des Datentyps Float64.

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 oder Float64.
  • 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)─┐
│              168.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:172022-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-30Date                                      │
└────────────┴───────────────────────────────────────────┘
SELECT toDate('2022-12-30') AS x, toTypeName(x)
┌──────────x─┬─toTypeName(toDate('2022-12-30'))─┐
│ 2022-12-30Date                             │
└────────────┴──────────────────────────────────┘
  • 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:582022-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.11Decimal(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ändlichere toDate(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 Zeichenkette
  • format - der Formatstring
  • timezone - 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 │
└───────────────────────────────────────────────────────────┘