-
(znak minus) — operator
Dotyczy: Databricks SQL Databricks Runtime
Zwraca odejmowanie wartości expr2
z expr1
.
Składni
expr1 - expr2
Argumenty
expr1
: wyrażenie liczbowe, DATE, TIMESTAMP lub INTERVAL.expr2
: Akceptowany typ zależy od typuexpr
:- Jeśli
expr1
jest wyrażeniem liczbowymexpr2
, musi być wyrażeniem liczbowym - Jeśli
expr1
jest to interwał miesiąca lub dnia,expr2
musi być zgodną klasą interwału. - W przeciwnym razie
expr2
musi być sygnaturą DATE lub TIMESTAMP.
- Jeśli
Zwraca
Typ wyniku jest określany w następującej kolejności:
- Jeśli
expr1
jest wartością liczbową, wynik jest typowym maksymalnym typem argumentów. - Jeśli
expr1
jest to DATA iexpr2
jest interwałem dnia, wynik jest sygnaturą CZASOWĄ. - Jeśli
expr1
jest sygnaturą CZASOWĄ iexpr2
jest interwałem, wynik jest sygnaturą CZASOWĄ. - Jeśli
expr1
iexpr2
są datami, wynik jest wynikiemINTERVAL DAYS
. - Jeśli
expr1
lubexpr2
są sygnaturą CZASOWĄ, wynik jest wynikiemINTERVAL DAY TO SECOND
. - Jeśli
expr1
iexpr2
są interwałami miesiąca roku, wynik jest interwałem miesiąca wystarczająco szerokiej liczby jednostek do reprezentowania wyniku. - Jeśli
expr1
iexpr2
są interwałami godzin dnia, wynik jest interwałem czasu dnia wystarczająco szerokiej liczby jednostek do reprezentowania wyniku. - W przeciwnym razie typ wyniku jest zgodny z
expr1
parametrem .
Jeśli oba wyrażenia są interwałami, muszą być z tej samej klasy.
Po odjęciu interwału miesiąca od daty usługa Databricks SQL gwarantuje, że wynikowa data jest dobrze sformułowana.
Jeśli wynik przepełni typ wyniku, usługa SQL usługi Databricks zgłasza błąd ARITHMETIC_OVERFLOW .
Użyj try_subtract , aby powrócić NULL
po przepełnieniu.
Ostrzeżenie
W środowisku Databricks Runtime, jeśli parametr spark.sql.ansi.enabled to false
, przepełnienie nie powoduje błędu, ale "zawija" wynik.
Przykłady
> 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