operador -
(sinal de subtração)
Aplica-se a: SQL do Databricks Runtime do Databricks
Retorna a diferença de expr2
subtraído de expr1
.
Sintaxe
expr1 - expr2
Argumentos
expr1
: uma expressão numérica de DATA, CARIMBO DE DATA/HORA ou INTERVALO.expr2
: o tipo aceito depende do tipo deexpr
:- Se
expr1
for um numérico,expr2
deverá ser uma expressão numérica - Se
expr1
for um intervalo de ano/mês ou dia/horário,expr2
deverá ser da classe correspondente de intervalo. - Caso contrário,
expr2
deve ser um DATA ou CARIMBO DE DATA/HORA.
- Se
Retornos
O tipo de resultado é determinado na seguinte ordem:
- Se
expr1
for numérico, o resultado será o tipo máximo comum dos argumentos. - Se
expr1
é uma DATA eexpr2
é um intervalo de dia/hora, o resultado é um CARIMBO DE DATA/HORA. - Se
expr1
é um CARIMBO DE DATA/HORA eexpr2
é um intervalo, o resultado é um CARIMBO DE DATA/HORA. - Se
expr1
eexpr2
forem DATEs, o resultado será umINTERVAL DAYS
. - Se
expr1
ouexpr2
é um CARIMBO DE DATA/HORA, o resultado é umINTERVAL DAY TO SECOND
. - Se
expr1
eexpr2
forem intervalos de ano/mês, o resultado será um intervalo de ano/mês com unidades suficientemente grandes para representar o resultado. - Se
expr1
eexpr2
são intervalos de dia/hora, o resultado é um intervalo de dia/hora com unidades suficientemente grandes para representar o resultado. - Caso contrário, o tipo de resultado é correspondente a
expr1
.
Se as duas expressões são um intervalo, elas devem ser da mesma classe.
Ao subtrair um intervalo de ano/mês de uma DATE, o SQL do Databricks garante que a data resultante seja bem formada.
Se o resultado estoura o tipo de resultado, o SQL do Databricks gera um erro de ARITHMETIC_OVERFLOW.
Use try_subtract para retornar NULL
no estouro.
Aviso
No Databricks Runtime, se spark.sql.ansi.enabled for false
, um estouro não causará um erro, mas "encapsulará" o resultado.
Exemplos
> 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