2013-07-22 64 views
0

我與存儲在多個領域日期爲整數(模擬字段名)的數據庫工作:按日期範圍過濾時的日期被分成多個領域

  • 世紀:CC01:20
  • 年:YR01:13
  • 月份:MO01:7
  • 日:DY01:22

我可以制訂日期作爲這樣:DATE((CC01 * 100 + YR01) || '-' || MO01 || '-' || DY01)

問題是當我需要篩選一系列日期時。例如,如果我要選擇過去90天裏,我可以寫這樣的事情...

WHERE DATE((CC01 * 100 + YR01) || '-' || MO01 || '-' || DY01) >= CURRENT DATE - 90 DAYS

這裏的問題是性能。我正在尋找一種有效的方法來編寫這個公式,它將函數限制在方程的右邊。

這裏是將與今天的日期工作爲例(我並不需要擔心世紀,我離開了一些細節):

WHERE CC01 = 20 AND YR01 >= RIGHT(YEAR(CURRENT DATE - 7 DAYS),2) AND MO01 >= MONTH(CURRENT DATE - 7 DAYS) AND DY01 >= DAY(CURRENT DATE - 7 DAYS)

這隻能是因爲要回7天使我們保持當前的月份和年份。我也不希望有一大堆的AND和OR(如果可能的話)。

+0

選擇它作爲額外的列,所以你只需要定義一次?並在where子句中使用該列。也許它更容易將日期轉換爲UNIX時間戳(整數),並限制'BETWEEN val1和val2' – UrGuardian4ngel

+0

我的問題是該表有幾億條記錄。表值中的任何函數都將永遠處理並使用太多的臨時空間。 –

+0

您可以創建一個將多個日期整數轉換爲DB2日期的DB2視圖。您已經提供了該公式。 –

回答

1

我相信我可能找到了解決方案。

 CC01 = 20 
     AND 
     YR01 >= RIGHT(YEAR(CURRENT DATE - 220 DAYS),2) 
     AND NOT 
      (
      YR01 = RIGHT(YEAR(CURRENT DATE - 220 DAYS),2) 
      AND 
      MO01 = MONTH(CURRENT DATE - 220 DAYS) 
      AND 
      DY01 < DAY(CURRENT DATE - 220 DAYS) 
      ) 
     AND NOT 
      (
      YR01 = RIGHT(YEAR(CURRENT DATE - 220 DAYS),2) 
      AND 
      MO01 < MONTH(CURRENT DATE - 220 DAYS) 
      ) 
1

是否有日期的長度的限制範圍,你會質疑呢? 對於短距離,可以生成一個詳細的動態SQL這樣的:

WHERE 
    (CC01 = 20 AND YR01 = 07 AND MO01 = 02 AND DY01 = 01) 
OR (CC01 = 20 AND YR01 = 07 AND MO01 = 03 AND DY01 = 04) 
OR (CC01 = 20 AND YR01 = 07 AND MO01 = 04 AND DY01 = 03) 

你不得不配置文件,看看再查詢是否補償更快的查找(我的直覺說跨越數億記錄函數調用將會變慢,儘管直覺永遠不會被信任)。

+0

不幸的是,日期範圍需要動態變化 –

+0

如果你的日期範圍限制在幾百個,而你的數據庫表是幾百萬 - 那麼最好每個請求日期進行額外的處理而不是每個請求日期, DB-行。 –

+0

是的,我的意思是在任何代碼調用數據庫 –

0

定義一個函數來轉換爲日期

CREATE FUNCTION parts2date (cc int, yy int, mm int, dd int) returns date 
    LANGUAGE SQL 
    CONTAINS SQL 
    DETERMINISTIC 
    BEGIN 
    RETURN DATE(RIGHT(DIGITS(cc),2)||RIGHT(DIGITS(yy),w)||'-' 
       ||RIGHT(DIGITS(mm),2)||'-'||RIGHT(DIGITS(dd),2)); 
    END; 

您可以添加一個情況處理程序,對錯誤返回null。

+0

我只有對數據庫的讀取權限。我無法創建一個函數。另外,這個函數需要在每個行的範圍之前運行。這會導致性能問題。 –

+0

WHERE子句中的條件在幾乎所有其他條件之前進行評估。也許DB2在您的平臺上的工作方式不同,但在IBM i上,性能會更好,而不會更糟。 – WarrenT

+0

您的DBA或同等人員可能願意爲您創建適用的功能。通常我們喜歡做改善性能的事情。 ;-) – WarrenT