- Opérateur (signe moins)

S’applique à :case marquée oui Databricks SQL case marquée oui Databricks Runtime

Retourne la soustraction de expr2 à partir de expr1.

Syntaxe

expr1 - expr2

Arguments

  • expr1 : expression numérique, DATE, TIMESTAMP ou INTERVAL.
  • expr2 : le type accepté dépend du type de expr :
    • Si expr1 est une valeur numérique, expr2 doit être une expression numérique
    • Si expr1 est un intervalle année-mois ou jour-temps, expr2 doit être de la classe d’intervalle correspondante.
    • Dans le cas contraire, expr2 doit être une valeur DATE ou TIMESTAMP.

Retours

Le type de résultat est déterminé dans l’ordre suivant :

  • Si expr1 est un nombre, le résultat est le type maximal commun des arguments.
  • Si expr1 est de type DATE et que expr2 est un intervalle de jour-heure, le résultat est de type TIMESTAMP.
  • Si expr1 est de type TIMESTAMP et expr2 est un intervalle, le résultat est de type TIMESTAMP.
  • Si expr1 et expr2 sont de type DATE, le résultat est un INTERVAL DAYS.
  • Si expr1 ou expr2 sont de type TIMESTAMP, le résultat est un INTERVAL DAY TO SECOND.
  • Si expr1 et expr2 sont des intervalles d’année-mois, le résultat est un intervalle d’année-mois qui correspond à des unités suffisamment grandes pour représenter le résultat.
  • Si expr1 et expr2 sont des intervalles de jour-heure, le résultat est un intervalle de jour-heure qui correspond à des unités suffisamment grandes pour représenter le résultat.
  • Sinon, le type de résultat correspond à expr1.

Si les deux expressions sont des intervalles, elles doivent être de la même classe.

Lorsque vous soustrayez un intervalle année-mois d’une DATE, Databricks SQL vérifie que la date obtenue est bien formée.

Si le résultat dépasse le type de résultat, Databricks SQL génère une erreur ARITHMETIC_OVERFLOW.

Utilisez try_subtract pour retourner NULL en cas de dépassement de capacité.

Avertissement

Dans Databricks Runtime, si spark.sql.ansi.enabled est false, un dépassement ne provoque pas d’erreur, mais « enveloppe » le résultat à la place.

Exemples

> 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