Оператор-
(знак минуса)
Область применения: Databricks SQL
Databricks Runtime
Возвращает результат вычитания expr2
из expr1
.
Синтаксис
expr1 - expr2
Аргументы
expr1
: числовое выражение, DATE, TIMESTAMP или INTERVAL.expr2
: принятый тип зависит от типаexpr
:- если
expr1
является числовым выражением, тоexpr2
также должно быть числовым выражением; - если
expr1
является интервалом типа "год-месяц" или "время дня", тоexpr2
также должно быть интервалом того же типа; - во всех остальных случаях
expr2
должно быть выражением DATE или TIMESTAMP.
- если
Возвраты
Тип результата определяется по следующему алгоритму:
- если аргумент
expr1
является числовым, результат имеет тип, соответствующий максимальному общему типу аргументов; - Если параметр
expr1
имеет тип DATE, аexpr2
является интервалом типа "время дня", то возвращается результат с типом TIMESTAMP. - если
expr1
является выражением TIMESTAMP, аexpr2
— интервалом, то результат будет иметь тип TIMESTAMP; - если
expr1
иexpr2
являются выражениями DATE, то результат будет иметь типINTERVAL DAYS
; - если
expr1
иexpr2
являются выражениями TIMESTAMP, то результат будет иметь типINTERVAL DAY TO SECOND
; - Если
expr1
иexpr2
являются интервалами "год-месяц", то результат также будет интервалом "год-месяц" с достаточно широкими единицами измерения для представления результата. - если
expr1
иexpr2
являются интервалами "время дня", то результат также будет интервалом "время дня" с достаточно широкими единицами измерения для представления результата; - в противном случае тип результата будет соответствовать
expr1
.
Если оба выражения являются интервалами, они должны быть одного класса.
При вычитании интервала типа "год-месяц" из выражения DATE Databricks SQL автоматически обеспечивает правильный формат полученного значения даты.
Если результат переполняет тип результата, Databricks SQL вызывает ошибку ARITHMETIC_OVERFLOW.
Используйте try_subtract для возврата NULL
при переполнении.
Предупреждение
В Databricks Runtime, если spark.sql.ansi.enabledfalse
, переполнение не приводит к ошибке, но "заворачивает" результат вместо этого.
Примеры
> 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