簡體   English   中英

SQL 服務器 - 操作順序難度

[英]SQL Server - Order of Operations difficulty

試圖弄清楚如何正確訂購以獲得預期的結果。 我正在尋找的是 A 為真,而 B、C 或 D 中的任何一個也為真。 Starting_Date 和 Ending_Date 在代碼的前面定義。

  1. 如果我使用如下所示的 A && ((B)||(C)||(D)),則不會返回任何結果。
  2. 如果我使用我認為在邏輯上與上述相同的 A && (B || C || D),也不會返回任何結果。
  3. 如果我使用 A && B || C || D,我認為將 A 組和 B 組放在一起,我會得到幾千個結果
  4. 如果我在 Between 語句周圍加上括號,我會得到一個錯誤(無效的語法)
Declare @Starting_Date  date = '2019-01-01'
Declare @Ending_Date    date = '2019-01-31'

Select x
From y   
Where   REPORTING_UNIT = '36B11' --A
                        AND ((Closing_Date          BETWEEN @Starting_Date AND @Ending_Date) --B Closing date is between report date range (eg: episode already open before period)
                        OR  (Opening_Date           BETWEEN @Starting_Date AND @Ending_Date) --C Opening date is between report date range (eg: episode was opened at some point during the period)
                        OR  (Reverse_Opening_Date   BETWEEN @Starting_Date AND @Ending_Date)) --D Reverse opening date is between report date range (eg: episode was closed at some point, then reopened during the period)

預期成績:

1858 年是數據庫表示“它沒有關閉”的方式。 所以在這個例子中,除了第 14 行之外,所有這些都將包括在內,該行在我們定義的結束日期之前關閉。 第 5 行和第 6 行也將包括在內,因為該劇集在我們評估期間是開放的。

在此處輸入圖像描述

編輯:添加了編碼的開始和結束日期以及一些預期結果。

只需在WHERE子句中保留REPORTING_UNIT = '36B11' AND Closing_Date BETWEEN @Starting_Date AND @Ending_Date條件,然后查看獲得的結果,然后逐個添加OR條件,您可能會了解為什么會發生這種情況。 此外,粗略瀏覽一下您的上述數據后,邏輯上只應包括第 5 行。 BETWEEN子句將只檢查日期范圍,第 5 行滿足這一要求。

以下是您的代碼減去 OR 序列中的冗余括號,應該可以工作。

您對@Starting_Date 和@Ending_Date 的值有信心嗎?

Select x
From y   
Where   REPORTING_UNIT = '36B11' --A
                        AND (Closing_Date          BETWEEN @Starting_Date AND @Ending_Date --B Closing date is between report date range (eg: episode already open before period)
                        OR  Opening_Date           BETWEEN @Starting_Date AND @Ending_Date --C Opening date is between report date range (eg: episode was opened at some point during the period)
                        OR  Reverse_Opening_Date   BETWEEN @Starting_Date AND @Ending_Date) --D Reverse opening date is between report date range (eg: episode was closed at some point, then reopened during the period)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM