Compartilhar via


operador - (sinal de subtração)

Aplica-se a: marca de seleção positiva SQL do Databricks marca de seleção positiva 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 de expr:
    • 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.

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 e expr2 é um intervalo de dia/hora, o resultado é um CARIMBO DE DATA/HORA.
  • Se expr1 é um CARIMBO DE DATA/HORA e expr2 é um intervalo, o resultado é um CARIMBO DE DATA/HORA.
  • Se expr1 e expr2 forem DATEs, o resultado será um INTERVAL DAYS.
  • Se expr1 ou expr2 é um CARIMBO DE DATA/HORA, o resultado é um INTERVAL DAY TO SECOND.
  • Se expr1 e expr2 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 e expr2 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