-
Operatore (segno meno)
Si applica a: controllo SQL di Databricks 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 valore numericoexpr2
deve essere un'espressione numerica - Se
expr1
è un intervallo di anno o di giorno,expr2
deve essere della classe di intervallo corrispondente. - In caso contrario
expr2
, deve essere un valore DATE o TIMESTAMP.
- Se
Restituisce
Il tipo di risultato viene determinato nell'ordine seguente:
- Se
expr1
è un valore numerico, il risultato è il tipo massimo comune degli argomenti. - Se
expr1
è un valore DATE edexpr2
è un intervallo di tempo di giorno, il risultato è timestamp. - Se
expr1
è un timestamp edexpr2
è un intervallo, il risultato è 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 di 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 giornaliero di unità sufficientemente estese per rappresentare il risultato. - In caso contrario, il tipo di risultato corrisponde a
expr1
.
Se entrambe le espressioni sono interval, devono essere della stessa classe.
Quando si sottrae un intervallo di mesi di anno da un valore DATE, Databricks SQL garantisce che la data risultante sia ben formata.
Se il risultato supera il 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 causa 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