• 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.enabled false ,则溢出不会导致错误,而是会将结果“换行”。

      > SELECT 2 - 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
      
    • *(星号)运算符
    • +(加号)运算符
    • /(正斜杠符号)运算符
    • sum 聚合函数
    • try_add 函数
    • try_subtract 函数
  •