-
(znak minus) — operator
Dotyczy: Databricks SQL Databricks Runtime
Zwraca odejmowanie wartości expr2
z .expr1
Składnia
expr1 - expr2
Argumenty
expr1
: wyrażenie liczbowe, DATE, TIMESTAMP lub INTERVAL.expr2
: Akceptowany typ zależy od typuexpr
:- Jeśli
expr1
wartość jest liczbowaexpr2
, 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ć znacznikiem DATY lub znacznika czasu.
- 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 datą iexpr2
jest interwałem dnia, wynik jest sygnaturą CZASOWĄ. - Jeśli
expr1
jest znacznikiem TIMESTAMP iexpr2
jest interwałem, wynik jest sygnaturą CZASOWĄ. - Jeśli
expr1
element iexpr2
są datami, wynik toINTERVAL DAYS
. - Jeśli
expr1
lubexpr2
jest znacznikiem TIMESTAMP, wynik toINTERVAL DAY TO SECOND
. - Jeśli
expr1
interwałyexpr2
i są interwałami miesięcy lat, wynik jest interwałem miesiąca z wystarczająco szerokimi jednostkami do reprezentowania wyniku. - Jeśli
expr1
iexpr2
są interwałami dni, wynik jest interwałem dziennym wystarczająco szerokich jednostek do reprezentowania wyniku. - W przeciwnym razie typ wyniku jest zgodny z
expr1
.
Jeśli oba wyrażenia są interwałami, muszą należeć do tej samej klasy.
Po odjęciu interwału miesiąca od daty usługa Databricks SQL gwarantuje, że wynikowa data jest prawidłowo sformułowana.
Jeśli wynik przepełni typ wyniku, usługa Databricks SQL zgłasza błąd ARITHMETIC_OVERFLOW .
Użyj try_subtract , aby powrócić NULL
do przepełnienia.
Ostrzeżenie
Jeśli w środowisku Databricks Runtime spark.sql.ansi.enabled to false
, przepełnienie nie powoduje błędu, ale "opakowuje" 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