Función cast
Se aplica a: Databricks SQL Databricks Runtime
Convierte el valor expr
al tipo de datos de destino type
. Este operador es sinónimo del operador :: (signo de dos puntos doble)
Sintaxis
cast(sourceExpr AS targetType)
Argumentos
sourceExpr
: cualquier expresión que se pueda convertir.targetType
: el tipo de datos del resultado.
Devoluciones
El resultado es de tipo targetType
.
Las siguientes combinaciones de conversión de tipos de datos son válidas:
Origen (fila) Destino (columna) | VOID | numeric | STRING | DATE | TIMESTAMP | TIMESTAMP_NTZ | year-month interval | day-time interval | BOOLEAN | BINARY | ARRAY | MAP | STRUCT |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
VOID | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y |
numeric | N | Y | Y | N | Y | N | Y | Y | Y | N | N | N | N |
STRING | N | Y | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N |
DATE | N | N | Y | Y | Y | Y | N | N | N | N | N | N | N |
TIMESTAMP | N | Y | Y | Y | Y | Y | N | N | N | N | N | N | N |
TIMESTAMP_NTZ | N | N | Y | Y | Y | Y | N | N | N | N | N | N | N |
year-month interval | N | Y | Y | N | N | N | Y | N | N | N | N | N | N |
day-time interval | N | Y | Y | N | N | N | N | Y | N | N | N | N | N |
BOOLEAN | N | Y | Y | N | Y | N | N | N | Y | N | N | N | N |
BINARY | N | Y | Y | N | N | N | N | N | N | Y | N | N | N |
ARRAY | N | N | Y | N | N | N | N | N | N | N | Y | N | N |
MAP | N | N | Y | N | N | N | N | N | N | N | N | Y | N |
STRUCT | N | N | Y | N | N | N | N | N | N | N | N | N | Y |
Reglas y limitaciones basadas en targetType
Advertencia
En Databricks Runtime, si spark.sql.ansi.enabled es false
, un desbordamiento no provoca un error, sino que "ajusta" el resultado.
Un valor sourceExpr
con un formato no válido o caracteres no válidos para targetType
dará como resultado un NULL
.
NUMERIC
Si targetType
es un valor numérico y sourceExpr
es de tipo:
-
El resultado es un valor NULL del tipo numérico especificado.
-
Si
targetType
es un valor numérico integral, el resultado sesourceExpr
trunca en un número entero.De lo contrario, el resultado se
sourceExpr
redondea a un ajuste de la escala disponible detargetType
.Si el valor está fuera del intervalo de
targetType
, se genera un error de desbordamiento.Use try_cast para convertir errores de desbordamiento en
NULL
. -
sourceExpr
se lee como un valor literal detargetType
.Si
sourceExpr
no cumple el formato de los valores literales, se genera un error.Si el valor está fuera del intervalo de
targetType
, se genera un error de desbordamiento.Use try_cast para convertir los errores de desbordamiento y formato no válidos en
NULL
. -
El resultado es el número de segundos transcurridos entre
1970-01-01 00:00:00 UTC
ysourceExpr
.Si
targetType
es un valor numérico integral, el resultado se trunca en un número entero.De lo contrario, el resultado se redondea a un ajuste de la escala disponible de
targetType
.Si el resultado está fuera del intervalo de
targetType
, se genera un error de desbordamiento.Use try_cast para convertir errores de desbordamiento en
NULL
. -
Se aplica a: Databricks SQL Databricks Runtime 11.3 LTS y versiones posteriores
El tipo de destino debe ser un valor numérico exacto.
Dado un
INTERVAL upper_unit TO lower_unit
, el resultado se mide en el número total delower_unit
. Silower_unit
esSECOND
, las fracciones de segundo se almacenan a la derecha del separador decimal. Para todos los demás intervalos, el resultado siempre es un número entero. -
Si
sourceExpr
es:true
: el resultado es 0.false
: el resultado es 1.NULL
: el resultado esNULL
.
Ejemplos
> SELECT cast(NULL AS INT);
NULL
> SELECT cast(5.6 AS INT);
5
> SELECT cast(5.6 AS DECIMAL(2, 0));
6
> SELECT cast(-5.6 AS INT);
-5
> SELECT cast(-5.6 AS DECIMAL(2, 0));
-6
> SELECT cast(128 AS TINYINT);
Overflow
> SELECT cast(128 AS DECIMAL(2, 0));
Overflow
> SELECT cast('123' AS INT);
123
> SELECT cast('123.0' AS INT);
Invalid format
> SELECT cast(TIMESTAMP'1970-01-01 00:00:01' AS LONG);
1
> SELECT cast(TIMESTAMP'1970-01-01 00:00:00.000001' AS DOUBLE);
1.0E-6
> SELECT cast(TIMESTAMP'2022-02-01 00:00:00' AS SMALLINT);
error: overflow
> SELECT cast(true AS BOOLEAN);
1
> SELECT cast(INTERVAL '1-2' YEAR TO MONTH AS INTEGER);
14
> SELECT cast(INTERVAL '1:30.5' MINUTE TO SECOND AS DECIMAL(5, 2));
90.50
> SELECT cast(TRUE AS INT);
1
> SELECT cast(FALSE AS INT);
0
STRING
Si targetType
es un tipo de cadena y sourceExpr
es de tipo:
-
El resultado es una cadena NULL.
-
El resultado es el número literal con un signo menos opcional y sin ceros a la izquierda del separador decimal. Si
targetType
esDECIMAL(p, s)
cons
mayor que 0, se agrega un separador decimal y se agregan ceros finales para escalar. -
Si el número absoluto es menor que
10,000,000
y mayor o igual que0.001
, el resultado se expresa sin notación científica con al menos un dígito en cualquier lado del separador decimal.De lo contrario, Azure Databricks usa una mantisa seguida de
E
y de un exponente. La mantisa tiene un signo menos inicial opcional seguido de un dígito a la izquierda del separador decimal y el número mínimo de dígitos mayores que cero a la derecha. El exponente tiene un signo menos inicial opcional. -
Si el año está comprendido entre 9999 BCE y 9999 CE, el resultado es una dateString de la forma
-YYYY-MM-DD
yYYYY-MM-DD
, respectivamente.Durante años anteriores o posteriores a este intervalo, el número necesario de dígitos se agrega al componente de año y
+
se usa para CE. -
Si el año está comprendido entre 9999 BCE y 9999 CE, el resultado es una timestampString de la forma
-YYYY-MM-DD hh:mm:ss
yYYYY-MM-DD hh:mm:ss
, respectivamente.Durante años anteriores o posteriores a este intervalo, el número necesario de dígitos se agrega al componente de año y
+
se usa para CE.Las fracciones de segundo
.f...
se agregan si es necesario. -
Si el año está comprendido entre 9999 BCE y 9999 CE, el resultado es una timestampString de la forma
-YYYY-MM-DD hh:mm:ss
yYYYY-MM-DD hh:mm:ss
, respectivamente.Durante años anteriores o posteriores a este intervalo, el número necesario de dígitos se agrega al componente de año y
+
se usa para CE.Las fracciones de segundo
.f...
se agregan si es necesario. -
El resultado es su representación más corta del literal de intervalo. Si el intervalo es negativo, el signo se inserta en
interval-string
. Para unidades menores de 10, se omiten los ceros iniciales.Una cadena de intervalo de mes y año típica tiene la forma:
INTERVAL 'Y' YEAR
INTERVAL 'Y-M' YEAR TO MONTH
INTERVAL 'M' MONTH
-
El resultado es su representación más corta del literal de intervalo. Si el intervalo es negativo, el signo se inserta en
interval-string
. En el caso de las unidades menores que 10, se omiten los ceros iniciales.Una cadena de intervalo de tiempo de día típica tiene el formato:
INTERVAL 'D' DAY
INTERVAL 'D h' DAY TO HOUR
INTERVAL 'D h:m' DAY TO MINUTE
INTERVAL 'D h:m:s' DAY TO SECOND
INTERVAL 'h' HOUR
INTERVAL 'h:m' HOUR TO MINUTE
INTERVAL 'm:s' MINUTE TO SECOND
INTERVAL 's' SECOND
-
El resultado del valor booleano
true
es el literal de cadenatrue
, parafalse
es el literal de cadenafalse
y paraNULL
es la cadena NULL. -
Un resultado es el
sourceExpr
binario interpretado como una secuencia de caracteres UTF-8.Azure Databricks no valida los caracteres UTF-8. Una conversión de
BINARY
aSTRING
nunca insertará caracteres de sustitución ni generará un error. -
El resultado es una lista separada por comas de elementos de conversión, entre corchetes
[ ]
. Un espacio sigue cada coma. Un elementoNULL
se traduce a un literalnull
.Azure Databricks no cita ni marca elementos individuales, que pueden contener corchetes o comas.
-
El resultado es una lista separada por comas de pares clave-valor de conversión entre llaves
{ }
. Un espacio sigue cada coma. Los pares de clave-valor están separados entre ellos por->
. Un valor de asignaciónNULL
se traduce a literalnull
.Azure Databricks no cita ni marca valores o claves individuales, que pueden contener llaves, comas o
->
. -
El resultado es una lista separada por comas de valores de campo de conversión, entre llaves
{ }
. Un espacio sigue cada coma. Un valor de campoNULL
se traduce a un literalnull
.Azure Databricks no cita ni marca valores de campo individuales, que pueden contener llaves o comas.
Ejemplos
> SELECT cast(NULL AS STRING);
NULL
> SELECT cast(-3Y AS STRING);
-3
> SELECT cast(5::DECIMAL(10, 5) AS STRING);
5.00000
> SELECT cast(12345678e-4 AS STRING);
1234.5678
> SELECT cast(1e7 as string);
1.0E7
> SELECT cast(1e6 as string);
1000000.0
> SELECT cast(1e-4 as string);
1.0E-4
> SELECT cast(1e-3 as string);
0.001
> SELECT cast(12345678e7 AS STRING);
1.2345678E14
> SELECT cast(DATE'1900-12-31' AS STRING);
1900-12-31
-- Caesar no more
> SELECT cast(DATE'-0044-03-15' AS STRING);
-0044-03-15
> SELECT cast(DATE'100000-12-31' AS STRING);
+100000-12-31
> SELECT cast(current_timestamp() AS STRING);
2022-04-02 22:29:09.783
> SELECT cast(TIMESTAMP_NTZ'2023-01-01' AS STRING);
2023-01-01 00:00:00
> SELECT cast(INTERVAL -'13-02' YEAR TO MONTH AS STRING);
INTERVAL '-13-2' YEAR TO MONTH
> SELECT cast(INTERVAL '12:04.9900' MINUTE TO SECOND AS STRING);
INTERVAL '12:04.99' MINUTE TO SECOND
> SELECT cast(true AS STRING);
true
> SELECT cast(false AS STRING);
false
-- A bad UTF-8 string
> SELECT cast(x'33800033' AS STRING);
3�3
> SELECT hex(cast(x'33800033' AS STRING));
33800033
> SELECT cast(array('hello', NULL, 'world') AS STRING);
[hello, null, world]
> SELECT cast(array('hello', 'wor, ld') AS STRING);
[hello, wor, ld]
> SELECT cast(array() AS STRING);
[]
> SELECT cast(map('hello', 1, 'world', null) AS STRING);
{hello -> 1, world -> null}
> SELECT cast(map('hello -> 1', DATE'2022-01-01') AS STRING);
{hello -> 1 -> 2022-01-01}
> SELECT cast(map() AS STRING);
{}
> SELECT cast(named_struct('a', 5, 'b', 6, 'c', NULL) AS STRING);
{5, 6, null}
> SELECT cast(named_struct() AS STRING);
{}
DATE
Si targetType
es un tipo DATE y sourceExpr
es de tipo:
-
El resultado es un valor DATE NULL.
-
sourceExpr
debe ser una dateString válida.Si
sourceExpr
es undateString
no válido, Azure Databricks devuelve un error.Use try_cast para convertir errores de datos no válidos en
NULL
. -
El resultado es la parte de fecha de la marca de tiempo
sourceExpr
. -
El resultado es la parte de la fecha de timestamp_ntz
sourceExpr
.
Ejemplos
> SELECT cast(NULL AS DATE);
NULL
> SELECT cast('1900-10-01' AS DATE);
1900-10-01
> SELECT cast('1900-10-01' AS DATE);
1900-10-01
-- There is no February 30.
> SELECT cast('1900-02-30' AS DATE);
Error
> SELECT cast(TIMESTAMP'1900-10-01 12:13:14' AS DATE);
1900-10-01
> SELECT cast(TIMESTAMP_NTZ'1900-10-01 12:13:14' AS DATE);
1900-10-01
timestamp
Si targetType
es un tipo TIMESTAMP y sourceExpr
es de tipo:
-
El resultado es un valor DATE NULL.
-
sourceExpr
se lee como el número de segundos desde1970-01-01 00:00:00 UTC
.Las fracciones más pequeñas que los microsegundos se truncan.
Si el valor está fuera del intervalo de
TIMESTAMP
, se genera un error de desbordamiento.Use try_cast para convertir errores de desbordamiento en
NULL
. -
sourceExpr
debe ser un elemento timestampString válido.Si
sourceExpr
es untimestampString
no válido, Azure Databricks devuelve un error.Use try_cast para convertir errores de datos no válidos en
NULL
. -
El resultado es el valor
sourceExpr
DATE en00:00:00
horas.
El resultado es un valor de marca de tiempo con los mismos campos year/month/day/hour/minute/second de timestamp_ntz sourceExpr
.
Ejemplos
> SELECT cast(NULL AS TIMESTAMP);
NULL
> SET TIME ZONE '+00:00';
> SELECT cast(0.0 AS TIMESTAMP);
1970-01-01 00:00:00
> SELECT cast(0.0000009 AS TIMESTAMP);
1970-01-01 00:00:00
> SELECT cast(1e20 AS TIMESTAMP);
Error: overflow
> SELECT cast('1900' AS TIMESTAMP);
1900-01-01 00:00:00
> SELECT cast('1900-10-01 12:13:14' AS TIMESTAMP);
1900-10-01 12:13:14
> SELECT cast('1900-02-30 12:13:14' AS TIMESTAMP);
Error
> SELECT cast(DATE'1900-10-01' AS TIMESTAMP);
1900-10-01 00:00:00
> SELECT cast(TIMESTAMP_NTZ'2023-01-01 02:03:04.567' as TIMESTAMP)
2023-01-01 02:03:04.567
TIMESTAMP_NTZ
Si targetType
es un tipo TIMESTAMP y sourceExpr
es del tipo:
-
El resultado es un valor DATE NULL.
-
sourceExpr
debe ser un elemento timestampString válido.Si
sourceExpr
es untimestampString
no válido, Azure Databricks devuelve un error.Use try_cast para convertir errores de datos no válidos en
NULL
. -
El resultado es el valor
sourceExpr
DATE en00:00:00
horas.
El resultado es la hora local como en sourceExpr
la zona horaria de la sesión.
Ejemplos
> SELECT cast(NULL AS TIMESTAMP_NTZ);
NULL
> SELECT cast('1900' AS TIMESTAMP_NTZ);
1900-01-01 00:00:00
> SELECT cast('1900-10-01 12:13:14' AS TIMESTAMP_NTZ);
1900-10-01 12:13:14
> SELECT cast('1900-02-30 12:13:14' AS TIMESTAMP_NTZ);
Error
> SELECT cast(DATE'1900-10-01' AS TIMESTAMP_NTZ);
1900-10-01 00:00:00
> SELECT current_timezone(), CAST(TIMESTAMP'2021-7-1T8:43:28' as TIMESTAMP_NTZ);
America/Los_Angeles 2021-07-01 08:43:28
> SELECT current_timezone(), CAST(TIMESTAMP'2021-7-1T8:43:28UTC+3' as TIMESTAMP_NTZ);
America/Los_Angeles 2021-06-30 22:43:28
Intervalo de mes y año
Si targetType
es un intervalo de año-mes y sourceExpr
es de tipo:
-
El resultado es un intervalo de mes y año NULL.
-
Se aplica a: Databricks SQL Databricks Runtime 11.3 LTS y versiones posteriores
El valor numérico se interpreta como número de unidades inferiores del
targetType
yearmonthIntervalQualifier. -
sourceExpr
debe ser un valor yearMonthIntervalString válido.Si
sourceExpr
es unyearMonthIntervalString
no válido, Azure Databricks devuelve un error.Use try_cast para convertir errores de datos no válidos en
NULL
. -
Si
targetType
yearMonthIntervalQualifier incluyeMONTH
, el valor permanece sin cambios, pero se reinterpreta para que coincida con el tipo de destino.De lo contrario, si el tipo de origen yearMonthIntervalQualifier incluye
MONTH
, el resultado se trunca a años completos.
Ejemplos
> SELECT cast(NULL AS INTERVAL YEAR);
NULL
> SELECT cast('1-4' AS INTERVAL YEAR TO MONTH)::STRING;
INTERVAL '1-4' YEAR TO MONTH
> SELECT cast('1' AS INTERVAL YEAR TO MONTH);
error
> SELECT cast(INTERVAL '1-4' YEAR TO MONTH AS INTERVAL MONTH)::STRING;
INTERVAL '16' MONTH
> SELECT cast(14 AS INTERVAL YEAR TO MONTH)::STRING;
INTERVAL '1-2' YEAR TO MONTH
> SELECT cast(INTERVAL '1-11' YEAR TO MONTH AS INTERVAL YEAR)::STRING;
INTERVAL '1' YEAR
Intervalo de día y hora
Si targetType
es un intervalo de día y hora y sourceExpr
es de tipo:
-
El resultado es un intervalo de día y hora NULL.
-
Se aplica a: Databricks SQL Databricks Runtime 11.3 LTS y versiones posteriores
El valor numérico se interpreta como número de unidades inferiores del
targetType
dayTimeIntervalQualifier. Si la unidad esSECOND
cualquier fracción se interpreta como fracciones de segundos. -
sourceExpr
debe ser un valor dayTimeIntervalString válido.Si
sourceExpr
es undayTimeIntervalString
no válido, Azure Databricks devuelve un error.Use try_cast para convertir errores de datos no válidos en
NULL
. -
Si
targetType
dayTimeIntervalQualifier incluye la unidad más pequeña del tipo de origen dayTimeIntervalQualifier, el valor permanece sin cambios, pero se reinterpreta para que coincida con el tipo de destino.De lo contrario, el intervalo
sourceExpr
se trunca para ajustarse atargetType
.
> SELECT cast(NULL AS INTERVAL HOUR);
NULL
> SELECT cast('1 4:23' AS INTERVAL DAY TO MINUTE)::STRING;
INTERVAL '1 04:23' DAY TO MINUTE
> SELECT cast('1' AS INTERVAL DAY TO MINUTE);
error
> SELECT cast(INTERVAL '1 4:23' DAY TO MINUTE AS INTERVAL MINUTE)::STRING;
INTERVAL '1703' MINUTE
> SELECT cast(INTERVAL '1 4:23' DAY TO MINUTE AS INTERVAL HOUR)::STRING;
INTERVAL '28' HOUR
> SELECT cast(125.3 AS INTERVAL MINUTE TO SECOND)::STRING;
INTERVAL '2:5.3' MINUTE TO SECOND
BOOLEAN
Si targetType
es un valor BOOLEAN y sourceExpr
es de tipo:
-
El resultado es un booleano NULL.
-
Si
sourceExpr
es:0
: el resultado esfalse
.NULL
: el resultado esNULL
.special floating point value
: el resultado estrue
.
De lo contrario, el resultado es
true
.
-
Si
sourcEexpr
es (no distingue entre mayúsculas y minúsculas):'T', 'TRUE', 'Y', 'YES', or '1'
: el resultado estrue
'F', 'FALSE', 'N', 'NO', or '0'
: el resultado esfalse
NULL
: el resultado esNULL
De lo contrario, Azure Databricks devuelve una sintaxis de entrada no válida para el error de tipo booleano.
Use try_cast para convertir errores de datos no válidos en
NULL
.
Ejemplos
> SELECT cast(NULL AS BOOLEAN);
NULL
> SELECT cast('T' AS BOOLEAN);
true
> SELECT cast('True' AS BOOLEAN);
true
> SELECT cast('1' AS BOOLEAN);
true
> SELECT cast('0' AS BOOLEAN);
false
> SELECT cast('n' AS BOOLEAN);
false
> SELECT cast('on' AS BOOLEAN);
error: invalid input syntax for type boolean
> SELECT cast(0 AS BOOLEAN);
false
> SELECT cast(0.0E10 AS BOOLEAN);
false
> SELECT cast(1 AS BOOLEAN);
true
> SELECT cast(0.1 AS BOOLEAN);
true
> SELECT cast('NaN'::FLOAT AS BOOLEAN);
true
BINARY
Si targetType
es un valor BINARY y sourceExpr
es de tipo:
-
El resultado es un valor binario NULL.
-
El resultado es la codificación UTF-8 de
surceExpr
.
Ejemplos
> SELECT cast(NULL AS BINARY);
NULL
> SELECT hex(cast('Spark SQL' AS BINARY));
537061726B2053514C
> SELECT hex(cast('Oдesa' AS BINARY));
4FD0B4657361
ARRAY
Si targetType
es un objeto ARRAY < targetElementType > y sourceExpr
es de tipo:
-
El resultado es un valor NULL de
targeType
. -
Si se admite la conversión de
sourceElementType
atargetElementType
, el resultado es un elementoARRAY<targetElementType>
con todos los elementos convertidos entargetElementType
.Azure Databricks genera un error si no se admite la conversión o si alguno de los elementos no se puede convertir.
Use try_cast para convertir datos no válidos o errores de desbordamiento en
NULL
.
Ejemplos
> SELECT cast(NULL AS ARRAY<INT>);
NULL
> SELECT cast(array('t', 'f', NULL) AS ARRAY<BOOLEAN>);
[true, false, NULL]
> SELECT cast(array('t', 'f', NULL) AS INTERVAL YEAR);
error: cannot cast array<string> to interval year
> SELECT cast(array('t', 'f', 'o') AS ARRAY<BOOLEAN>);
error: invalid input syntax for type boolean: o.
MAP
Si targetType
es un elemento MAP < targetKeyType, targetValueType > y sourceExpr
es de tipo:
-
El resultado es un valor NULL de
targetType
. MAP <sourceKeyType, sourceValueType >
Si se admiten las conversiones de
sourceKeyType
atargetKeyType
y desourceValueType
atargetValueType
, el resultado es un elementoMAP<targetKeyType, targetValueType>
con todas las claves que se convierten entargetKeyType
y todos los valores convertidos entargetValueType
.Azure Databricks genera un error si no se admite la conversión o si alguna de las claves o valores no se puede convertir.
Use try_cast para convertir datos no válidos o errores de desbordamiento en
NULL
.
Ejemplos
> SELECT cast(NULL AS MAP<STRING, INT>);
NULL
> SELECT cast(map('10', 't', '15', 'f', '20', NULL) AS MAP<INT, BOOLEAN>);
{10:true,15:false,20:null}
> SELECT cast(map('10', 't', '15', 'f', '20', NULL) AS MAP<INT, ARRAY<INT>>);
error: cannot cast map<string,string> to map<int,array<int>>
> SELECT cast(map('10', 't', '15', 'f', '20', 'o') AS MAP<INT, BOOLEAN>);
error: invalid input syntax for type boolean: o.
STRUCT
Si targetType
es un valor STRUCT <[targetFieldName : targetFieldType [NOT NULL] [COMMENT str] [, …]] > y sourceExpr
es de tipo:
-
El resultado es un valor NULL de
targetType
. STRUCT < [sourceFieldName : sourceFieldType [NOT NULL] [COMMENT str] [, …]] >
El elemento
sourceExpr
se puede convertir atargetType
si se cumplen todas sus condiciones:- El tipo de origen tiene el mismo número de campos que el destino.
- Para todos los campos:
sourceFieldTypeN
se puede convertir entargetFieldTypeN
. - Para todos los valores de campo: el valor de campo de origen N se puede convertir en
targetFieldTypeN
y el valor no es null si el campo de destino N está marcado comoNOT NULL
.
Los valores
sourceFieldName
, las restricciones deNOT NULL
de origen y losCOMMENT
de origen no tienen que coincidir contargetType
y se omiten.Azure Databricks genera un error si no se admite la conversión o si alguna de las claves o valores no se puede convertir.
Use try_cast para convertir datos no válidos o errores de desbordamiento en
NULL
.
Ejemplos
> SELECT cast(NULL AS STRUCT<a:INT>);
NULL
> SELECT cast(named_struct('a', 't', 'b', '1900') AS STRUCT<b:BOOLEAN, c:DATE NOT NULL COMMENT 'Hello'>);
{"b":true,"c":1900-01-01}
> SELECT cast(named_struct('a', 't', 'b', NULL::DATE) AS STRUCT<b:BOOLEAN, c:DATE NOT NULL COMMENT 'Hello'>);
error: cannot cast struct<a:string,b:date> to struct<b:boolean,c:date>
> SELECT cast(named_struct('a', 't', 'b', '1900') AS STRUCT<b:BOOLEAN, c:ARRAY<INT>>);
error: cannot cast struct<a:string,b:string> to struct<b:boolean,c:array<int>>
> SELECT cast(named_struct('a', 't', 'b', 'hello') AS STRUCT<b:BOOLEAN, c:DATE>);
error: Cannot cast hello to DateType