-
Operatore (segno meno)
Si applica a: Databricks SQL Databricks Runtime
Restituisce la sottrazione di expr2
da expr1
.
Sintassi
expr1 - expr2
Argomenti
expr1
: espressione numerica, DATE, TIMESTAMP o INTERVAL.expr2
: il tipo accettato dipende dal tipo diexpr
:- Se
expr1
è un'espressione numericaexpr2
deve essere un'espressione numerica - Se
expr1
è un intervallo di tempo di un mese o di un giorno,expr2
deve essere della classe corrispondente di intervallo. - In caso contrario
expr2
, deve essere un valore DATE o TIMESTAMP.
- Se
Valori restituiti
Il tipo di risultato viene determinato nell'ordine seguente:
- Se
expr1
è un valore numerico, il risultato è un tipo massimo comune degli argomenti. - Se
expr1
è una data eexpr2
è un intervallo di tempo di giorno, il risultato è timeSTAMP. - Se
expr1
è un TIMESTAMP edexpr2
è un intervallo, il risultato è un TIMESTAMP. - Se
expr1
eexpr2
sono DATEs, il risultato è .INTERVAL DAYS
- Se
expr1
oexpr2
sono TIMESTAMP, il risultato è un oggettoINTERVAL DAY TO SECOND
. - Se
expr1
eexpr2
sono intervalli anno-mese, il risultato è un intervallo di mesi di anno di unità sufficientemente ampie per rappresentare il risultato. - Se
expr1
eexpr2
sono intervalli di tempo di giorno, il risultato è un intervallo di tempo di giorno di unità sufficientemente ampie per rappresentare il risultato. - In caso contrario, il tipo di risultato corrisponde a
expr1
.
Se entrambe le espressioni sono intervallo, devono essere della stessa classe.
Quando si sottrae un intervallo di mese di anno da una data, Databricks SQL garantisce che la data risultante sia ben formata.
Se il risultato esegue l'overflow del tipo di risultato, Databricks SQL genera un errore ARITHMETIC_OVERFLOW .
Usare try_subtract per restituire NULL
l'overflow.
Avviso
In Databricks Runtime, se spark.sql.ansi.enabled è false
, un overflow non genera un errore ma "esegue il wrapping" del risultato.
Esempi
> 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