Oracle

比較過程中 where 子句中的日期和時間戳變數

  • September 9, 2012

我在類型的 Oracle 儲存過程中有一個變數DATE(來自使用者界面)和另一個TIMESTAMP類型的變數(數據庫比使用者在執行儲存過程的程式碼中輸入的內容更精確)。

我想做這樣的事情:(虛擬碼)

select * from MYDATABASE where inputDate = extract(date from myDatabaseTimeStamp);

但是當我嘗試這個時出現編譯錯誤。知道什麼是一個好的實際程式碼解決方案嗎?

假設來自使用者界面的 DATE 可以包含除 00:00:00(午夜)之外的時間,並且您只想知道來自使用者界面的 DATE 和 TIMESTAMP 是否在同一天(不是相同的小時或分鐘或?),嘗試這個:

...

myDatabaseDate    DATE;
myDatabaseNextDay DATE;

BEGIN

 -- Change TIMESTAMP to a DATE type with CAST, then TRUNCate time to 00:00:00.
 myDatabaseDate    := TRUNC( CAST(myDatabaseTimeStamp as DATE) );
 myDatabaseNextDay := myDatabaseDate + 1;

 SELECT something into some_var
 FROM MYDATABASE 
 WHERE inputDate < myDatabaseNextDay
 AND inputDate >= myDatabaseDate; 

 ... 

注意1:因為“inputDate”是一個數據庫列並且可以被索引,我們不想這樣做,TRUNC(inputDate)因為那樣索引將不會被使用。

注意 2:在 SQL 語句之前執行CAST可防止此 PL/SQL 編譯警告:PLW-07204:從列類型轉換可能導致次優查詢計劃…編輯:在 10.2 XE 上對此進行測試後,即使“ myDatabaseDate + 1" 會導致警告,因此,雖然它似乎做了太多讓編譯器滿意,但我添加了 “myDatabaseNextDay := myDatabaseDate + 1;”

引用自:https://dba.stackexchange.com/questions/23931