2012-11-22 22 views
0

我有一個查詢,用戶輸入開始日期和結束日期。Oracle SQL Only選擇與月末或季末對齊的日期

AND PP.PATTR_CALCUL_DATE >= '31 JUN 2012' 
AND PP.PATTR_CALCUL_DATE <= '30 SEP 2012' 

查詢返回的數據是這樣的:基於用戶,無論是需要返回對準月底在指定範圍內的所有日期的查詢中定義一個varible

| DATE | VALUE | 
| 01/07/2012 | 1.25 | 
| 31/07/2012 | 2.25 | 
| 05/09/2012 | 1.75 | 
| 22/08/2012 | 3.99 | 
| 30/09/2012 | 1.25 | 
| 31/08/2012 | 6.37 | 

。 所以結果在這種情況下將是:

| DATE | VALUE | 
| 31/07/2012 | 2.25 | 
| 30/09/2012 | 1.25 | 
| 31/08/2012 | 6.37 | 

或它需要返回與季度末對齊所有日期。 凡結果將是:

| DATE | VALUE | 
| 30/09/2012 | 1.25 | 

他們還需要第三個選項,將只返回原始表

所有數據得到任何幫助,請。

感謝

回答

1

您可以將改變基礎上設置了一個param條件:

/* with :param = 'date' */ 
SQL> WITH data AS (
    2 SELECT to_date('01/07/2012', 'dd/mm/yyyy') dat, 1.25 value FROM DUAL 
    3 UNION ALL SELECT to_date('31/07/2012', 'dd/mm/yyyy'), 2.25 FROM DUAL 
    4 UNION ALL SELECT to_date('05/09/2012', 'dd/mm/yyyy'), 1.75 FROM DUAL 
    5 UNION ALL SELECT to_date('22/08/2012', 'dd/mm/yyyy'), 3.99 FROM DUAL 
    6 UNION ALL SELECT to_date('30/09/2012', 'dd/mm/yyyy'), 1.25 FROM DUAL 
    7 UNION ALL SELECT to_date('31/08/2012', 'dd/mm/yyyy'), 6.37 FROM DUAL 
    8 ) 
    9 SELECT dat, 
10   value 
11 FROM data 
12 WHERE dat = CASE :param 
13     WHEN 'date' THEN dat 
14     WHEN 'month' THEN last_day(dat) 
15     WHEN 'quarter' THEN add_months(trunc(dat, 'q'), 3) - 1 
16    END; 

DAT    VALUE 
----------- ---------- 
01/07/2012  1,25 
31/07/2012  2,25 
05/09/2012  1,75 
22/08/2012  3,99 
30/09/2012  1,25 
31/08/2012  6,37 


/* with :param = 'month' */ 
DAT    VALUE 
----------- ---------- 
31/07/2012  2,25 
30/09/2012  1,25 
31/08/2012  6,37 

/* with :param = 'quarter' */ 
DAT    VALUE 
----------- ---------- 
30/09/2012  1,25