2016-02-28 178 views
-3

我一直想看看網上找到一些地方,說明如果有這兩選擇之間的差異:這一個具有不完全相同的日期比較差異

update dim t 
set t.ind = case when t.date<trunc(sysdate) 
              and t.date<>to_date('01/01/0001','DD/MM/YYYY') then 1 
            else 0 
         end 

或者,但之間:

update dim_equip t 
set t.equip_unrecovered_ind = case when t.equip_return_date_due between to_date('02/01/0001','DD/MM/YYYY') 
              and trunc(sysdate-1) then 1 
            else 0 
           end 

我已經檢查了他們的解釋計劃,他們是完全一樣的。

enter image description here

+2

你想問什麼? – FallAndLearn

回答

2

它們在邏輯上是不同的。您似乎認爲日曆從0001-01-01開始。但是Oracle的date data type spans from -4712-01-01 to 9999-12-31

對於該範圍內的任何BCE日期,以及從0001-01-02到今天的任何CE日期,0001-01-01(00:00:00)和今天午夜之後的任何日期/時間。第二個查詢將在任何BCE日期得到零。

除非您有BCE日期,否則沒有實際的實際區別。至少只要您在0001-01-01的任何日期都在午夜。

另一個區別是,正如Gordon Linoff所建議的,如果您的表格的日期值具有非零時間分量。第一個查詢在排除日期的正午的午夜0001-01-01 00:00:00爲0。但是在當天的任何其他時間,即從0001-01-01 00:00:01到0001-01-01 23:59:59,它都會得到1。假設它實際上是一個日期;如果它是一個時間戳,那麼精度也會有所改變。第二個查詢在當天的任何時間都會得到0,並且只從0001-01-02 00:00:00獲得1。


你說這兩個查詢的計劃是完全一樣的。您展示的圖形表示可能是相同的,但這只是優化器選擇的訪問和加入路徑,並不是整個路徑。優化器正在爲兩者選擇全表掃描,但是這並沒有告訴你任何有關將返回什麼數據的信息。如果包含訪問和過濾謂詞,則會看到它們不同,反映了不同的邏輯。他們可能仍然以sae結果集爲結束,但這取決於您的實際數據。

由於@a_horse_with_no_name在對您早期問題的評論中說過,請查看純文本執行計劃,或者使用提供更多信息的工具(但請在問題中使用文本版本,而不是圖片)。請參閱how to get more information的文檔。

+0

事情是,第一個人比第二個人跑得長,可能會導致這種差異? – Yossi

+0

@Yossi - 如果您編輯您的問題以顯示每個查詢的完整(文本!)執行計劃,則可能會有一些您沒有看到的差異。但他們都必須讀取和更新表格中的每一行。它可能只是緩存,第二個查詢使用塊緩存中的數據,而不必再次訪問物理磁盤。嘗試以不同的順序多次運行這兩個語句。 –

+0

我如何獲得完整的執行計劃?我只在plsql開發者中有一個按鈕/ f5,它給了我一個解釋計劃輸出 – Yossi

1

乍一看,假設t.date沒有時間分量,那麼這兩個應該是相同的。而且我甚至認爲,對於你的邏輯來說,時間部分不會有什麼區別。

由於第二個條件使用不同的日期,所以略有差異。

通常,這兩種方法都必須讀取所有數據,進行一些日期算術,然後爲所有行分配一個值。考慮到你有簡單的比較,閱讀和寫作將主導查詢的性能。所以,沒有理由期望一個人比另一個人好或者更差,試圖優化這個代碼是一個微型優化,其中的努力可能更好地花在其他地方。

+0

事情是,第一個人比第二個人跑得長很多,什麼會導致這種差異? – Yossi