-
Opérateur (signe moins)
S’applique à : Databricks SQL 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 deexpr
:- 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.
- Si
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 queexpr2
est un intervalle de jour-heure, le résultat est de type TIMESTAMP. - Si
expr1
est de type TIMESTAMP etexpr2
est un intervalle, le résultat est de type TIMESTAMP. - Si
expr1
etexpr2
sont de type DATE, le résultat est unINTERVAL DAYS
. - Si
expr1
ouexpr2
sont de type TIMESTAMP, le résultat est unINTERVAL DAY TO SECOND
. - Si
expr1
etexpr2
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
etexpr2
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