Оператор- (знак минуса)

Область применения:флажок 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.

Если оба выражения являются интервалами, они должны быть одного класса.

При вычитание интервала года из ДАТЫ Azure Databricks гарантирует, что результирующая дата хорошо сформирована.

Если результат переполнен типом результата, Azure Databricks вызывает ошибку ARITHMETIC_OVERFLOW или INTERVAL_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