INTERVAL 'Y-M' YEAR TO MONTH
INTERVAL 'M' MONTH
day-time interval
结果是间隔文本的最短表示形式。
如果间隔为负数,则在 interval-string
中嵌入符号。 对于小于 10 的单位,将省略前导零。
典型的日期时间间隔字符串采用以下格式:
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
true
布尔值的结果是字符串文本 true
;对于 false
,它是字符串文本 false
;对于 NULL
,它是 NULL 字符串。
结果是解释为 UTF-8 字符序列的二进制 sourceExpr
。
Azure Databricks 不验证 UTF-8 字符。 从 BINARY
到 STRING
的强制转换永远不会注入替代字符或引发错误。
结果是逗号分隔的强制转换元素列表,括在方括号 [ ]
中。 每个逗号后接一个空格。
NULL
元素转换为文本 null
。
Azure Databricks 不会用引号括住或以其他方式标记单个元素,这些元素本身可以包含括号或逗号。
结果是逗号分隔的强制转换键值对列表,括在大括号 { }
中。 每个逗号后接一个空格。
每个键值对由 ->
分隔。
NULL
映射值转换为文本 null
。
Azure Databricks 不会用引号括住或以其他方式标记单个键或值,这些键或值本身可以包含大括号、逗号或 ->
。
结果是逗号分隔的强制转换字段值列表,括在大括号 { }
中。 每个逗号后接一个空格。
NULL
字段值转换为文本 null
。
Azure Databricks 不会用引号括住或以其他方式标记单个字段值,这些值本身可以包含大括号或逗号。
> SELECT cast(NULL AS STRING);
> SELECT cast(-3Y AS STRING);
> 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(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);
> SELECT cast(false AS STRING);
false
-- A bad UTF-8 string
> SELECT cast(x'33800033' AS STRING);
> 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);
如果 targetType
是日期类型并且 sourceExpr
的类型为:
结果为 NULL 日期。
sourceExpr
必须是有效的 dateString。
如果 sourceExpr
不是有效的 dateString
,则 Azure Databricks 会返回错误。
使用 try_cast 将无效数据错误转换为 NULL
。
结果是时间戳 sourceExpr
的日期部分。
> SELECT cast(NULL AS DATE);
> 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
TIMESTAMP
如果 targetType
是时间戳类型并且 sourceExpr
的类型为:
结果为 NULL 日期。
sourceExpr
读取为自 1970-01-01 00:00:00 UTC
以来经过的秒数。
小于微秒的小数部分将被截断。
如果值超出 TIMESTAMP
的范围,则引发溢出错误。
使用 try_cast 将溢出错误转换为 NULL
。
sourceExpr
必须是有效的 timestampString。
如果 sourceExpr
不是有效的 timestampString
,则 Azure Databricks 会返回错误。
使用 try_cast 将无效数据错误转换为 NULL
。
结果是 00:00:00
小时后所处的 sourceExpr
日期。
> SELECT cast(NULL AS TIMESTAMP);
> 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
year-month interval
如果 targetType
是年月间隔并且 sourceExpr
的类型为:
结果是 NULL 年月间隔。
integral_numeric
适用于: Databricks SQL Databricks Runtime 11.2 及更高版本
该数值解释为 targetType
yearmonthIntervalQualifier 的低单位数。
sourceExpr
必须是有效的 yearMonthIntervalString。
如果 sourceExpr
不是有效的 yearMonthIntervalString
,则 Azure Databricks 会返回错误。
使用 try_cast 将无效数据错误转换为 NULL
。
year-month interval
如果 targetType
yearMonthIntervalQualifier 包含 MONTH
,则值保持不变,但被重新解释以匹配目标类型。
否则,如果源类型 yearMonthIntervalQualifier 包含 MONTH
,则结果将被截断为完整年份。
> SELECT cast(NULL AS INTERVAL YEAR);
> 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
day-time interval
如果 targetType
是日期时间间隔并且 sourceExpr
的类型为:
结果是 NULL 日期时间间隔。
exact_numeric
适用于: Databricks SQL Databricks Runtime 11.2 及更高版本
该数值解释为 targetType
dayTimeIntervalQualifier 的低单位数。
如果单位是 SECOND
,任何小数将解释为秒的小数形式。
sourceExpr
必须是有效的 dayTimeIntervalString。
如果 sourceExpr
不是有效的 dayTimeIntervalString
,则 Azure Databricks 会返回错误。
使用 try_cast 将无效数据错误转换为 NULL
。
day-time interval
如果 targetType
dayTimeIntervalQualifier 包含源类型 dayTimeIntervalQualifier 的最小单位,则值保持不变,但被重新解释以匹配目标类型。
否则,将截断 sourceExpr
间隔以适合 targetType
。
> SELECT cast(NULL AS INTERVAL HOUR);
> 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
如果 targetType
是布尔值并且 sourceExpr
的类型为:
结果是 NULL 布尔值。
如果 sourceExpr
为:
0
:结果为 false
。
NULL
:结果为 NULL
。
special floating point value
:结果为 true
。
否则,结果为 true
。
如果 sourcEexpr
是(不区分大小写):
'T', 'TRUE', 'Y', 'YES', or '1'
:结果为 true
'F', 'FALSE', 'N', 'NO', or '0'
:结果为 false
NULL
:结果为 NULL
否则,Azure Databricks 将为类型布尔值错误返回无效的输入语法。
使用 try_cast 将无效数据错误转换为 NULL
。
> SELECT cast(NULL AS BOOLEAN);
> SELECT cast('T' AS BOOLEAN);
> SELECT cast('True' AS BOOLEAN);
> SELECT cast('1' AS BOOLEAN);
> 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);
> SELECT cast(0.1 AS BOOLEAN);
> SELECT cast('NaN'::FLOAT AS BOOLEAN);
BINARY
如果 targetType
是二进制值并且 sourceExpr
的类型为:
结果是 NULL 二进制值。
结果是 surceExpr
的 UTF-8 编码。
> SELECT cast(NULL AS BINARY);
> SELECT hex(cast('Spark SQL' AS BINARY));
537061726B2053514C
> SELECT hex(cast('Oдesa' AS BINARY));
4FD0B4657361
ARRAY
如果 targetType
是 ARRAY <> 并且 sourceExpr
的类型为:
结果是 targeType
的 NULL 值。
ARRAY <sourceElementType>
如果支持从 sourceElementType
到 targetElementType
的强制转换,则结果是 ARRAY<targetElementType>
,其中的所有元素已强制转换为 targetElementType
。
如果不支持强制转换或无法强制转换任一元素,则 Azure Databricks 会引发错误。
使用 try_cast 将无效数据或溢出错误转换为 NULL
。
> SELECT cast(NULL AS ARRAY<INT>);
> 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.
如果 targetType
是 MAP <targetKeyType, targetValueType>并且 sourceExpr
的类型为:
结果是 targetType
的 NULL 值。
MAP <sourceKeyType, sourceValueType>
如果支持从 sourceKeyType
到 targetKeyType
以及从 sourceValueType
到 targetValueType
的强制转换,则结果是 MAP<targetKeyType, targetValueType>
,其中的所有键已强制转换为 targetKeyType
,所有值已强制转换为 targetValueType
。
如果不支持强制转换或无法强制转换任一键或值,则 Azure Databricks 会引发错误。
使用 try_cast 将无效数据或溢出错误转换为 NULL
。
> SELECT cast(NULL AS MAP<STRING, INT>);
> 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
如果 targetType
是 STRUCT <[targetFieldName : targetFieldType [NOT NULL] [COMMENT str] [, …]] > 并且 sourceExpr
的类型为:
结果是 targetType
的 NULL 值。
STRUCT < [sourceFieldName : sourceFieldType [NOT NULL] [COMMENT str] [, …]] >
如果满足以下所有条件,则 sourceExpr
可以强制转换为 targetType
:
源类型与目标具有相同数量的字段
对于所有字段:sourceFieldTypeN
可以强制转换为 targetFieldTypeN
。
对于所有字段值:源字段值 N 可以强制转换为 targetFieldTypeN
,如果目标字段 N 标记为 NOT NULL
,则值不为 null。
sourceFieldName
、源 NOT NULL
约束和源 COMMENT
不需要与 targetType
匹配,且将被忽略。
如果不支持强制转换或无法强制转换任一键或值,则 Azure Databricks 会引发错误。
使用 try_cast 将无效数据或溢出错误转换为 NULL
。
> SELECT cast(NULL AS STRUCT<a:INT>);
> 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
::(双冒号)运算符
try_cast 函数