Поделиться через


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

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