-
(减号)运算符
适用于: Databricks SQL Databricks Runtime
返回从 expr1
减去 expr2
得到的结果。
语法
expr1 - expr2
参数
expr1
:数值、DATE、TIMESTAMP 或 INTERVAL 表达式。expr2
:接受的类型取决于expr
类型:- 如果
expr1
是数值,则expr2
必须是数值表达式 - 如果
expr1
是年份或日期时间间隔,则expr2
必须是匹配的时间间隔类。 - 否则,
expr2
必须为 DATE 或 TIMESTAMP。
- 如果
返回
结果类型按以下顺序确定:
- 如果
expr1
是数值,则结果为参数的公共最大值类型。 - 如果
expr1
是 DATE,而expr2
是日期时间间隔,则结果为 TIMESTAMP。 - 如果
expr1
是 TIMESTAMP,而expr2
是时间间隔,则结果为 TIMESTAMP。 - 如果
expr1
和expr2
是 DATE,则结果为INTERVAL DAYS
。 - 如果
expr1
和expr2
是 TIMESTAMP,则结果为INTERVAL DAY TO SECOND
。 - 如果
expr1
和expr2
是年月时间间隔,则结果为用于表示结果的足够宽单位的年月时间间隔。 - 如果
expr1
和expr2
是日期时间间隔,则结果为用于表示结果的足够宽单位的日期时间间隔。 - 否则,结果类型与
expr1
一致。
如果两个表达式均为时间间隔,则它们必须属于同一类。
在从 DATE 减去年月时间间隔时,Databricks SQL 会确保生成的日期格式正确。
如果结果溢出结果类型,则 Databricks SQL 会引发 ARITHMETIC_OVERFLOW 错误。
使用 try_subtract 在溢出时返回 NULL
。
警告
在 Databricks Runtime 中,如果 spark.sql.ansi.enabled 为 false
,则溢出不会导致错误,而是会将结果“换行”。
示例
> SELECT 2 - 1;
1
> SELECT DATE'2021-03-20' - INTERVAL '2' MONTH
2021-1-20
> SELECT TIMESTAMP'2021-03-20 12:15:29' - INTERVAL '3' SECOND
2021-03-20 12:15:26
> SELECT typeof(INTERVAL '3' DAY - INTERVAL '2' HOUR);
interval day to hour
> SELECT typeof(current_date - (current_date + INTERVAL '1' DAY));
interval day
> SELECT typeof(current_timestamp - (current_date + INTERVAL '1' DAY));
interval day to second
> SELECT DATE'2021-03-31' - INTERVAL '1' MONTH;
2021-02-28
> SELECT -100Y - 100Y;
Error: ARITHMETIC_OVERFLOW