مشاركة عبر


- عامل التشغيل (علامة الطرح)

ينطبق على: وضع علامة Databricks SQL وضع علامة Databricks Runtime

إرجاع طرح من expr2 expr1.

بناء الجملة

expr1 - expr2

الوسيطات

  • expr1: تعبير رقمي أو تاريخ أو طابع زمني أو فاصل زمني.
  • expr2: يعتمد النوع المقبول على نوع expr:
    • إذا كان expr1 عبارة عن تعبير رقمي expr2 ، فيجب أن يكون تعبيرا رقميا
    • إذا كان expr1 فاصلا زمنيا لمدة شهر أو يوم، expr2 فيجب أن يكون من فئة المطابقة للفاصل الزمني.
    • وإلا expr2 يجب أن يكون DATE أو TIMESTAMP.

المرتجعات

يتم تحديد نوع النتيجة بالترتيب التالي:

  • إذا كان expr1 رقميا، فإن النتيجة هي النوع الأقصى الشائع للوسيطات.
  • إذا كان expr1 عبارة عن DATE وكان expr2 عبارة عن فاصل زمني لليوم، تكون النتيجة TIMESTAMP.
  • إذا كان expr1 TIMESTAMP وكان expr2 فاصلا زمنيا، تكون النتيجة TIMESTAMP.
  • إذا كانت expr1 و expr2 DATEs تكون النتيجة هي INTERVAL DAYS.
  • إذا كانت expr1 النتيجة TIMESTAMP أو expr2 هي 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;
 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