Oracle SQL仅选择与月末或季度末对齐的日期

时间:2012-11-22 15:34:51

标签: sql oracle date-arithmetic

我有一个查询,其中用户输入开始和结束日期。

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

查询返回如下数据:

|    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  |

或者它需要返回与Quarter end对齐的所有日期。 结果如下:

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

他们还需要第三个选项,它只返回原始表中的所有数据

请欣赏任何帮助。

由于

1 个答案:

答案 0 :(得分:1)

您可以创建一个基于参数更改的条件:

/* 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