几个月连接

时间:2010-12-07 10:58:08

标签: oracle list date

好的,我是新用connect by的东西。但它总是非常有用。我有这个小问题,你们可以帮助我......

鉴于开始月份(比如to_char(sysdate,'YYYYMM'))和结束月份(比如to_char(add_months(sysdate, 6),'YYYYMM')),想要以相同的格式获取两者之间的月份列表。

好吧,我想将它用于分区自动化脚本。到目前为止我最好的拍摄(非常可怜)会产生无效的月份,例如'201034'......(是的,我知道,非常低效)

遵循以下代码:

SELECT id
from
    (select to_char(add_months(sysdate, 6),'YYYYMM') as tn_end, to_char(sysdate,'YYYYMM') as tn_start from dual) tabla,
    (select * from
        (Select Level as Id from dual connect by Level <= (Select to_char(add_months(sysdate, 1),'YYYYMM')from dual)) where id > to_char(sysdate,'YYYYMM')) t
Where 
    t.Id between tabla.tn_start and tabla.tn_end

如何使此查询仅返回有效月份?有什么提示吗?

欢呼伙伴,

F。

3 个答案:

答案 0 :(得分:1)

为了生成日期和日期范围,我强烈建议您创建一个每天有一行的永久日历表。即使你在这张表中保留20年,它也会很小~7500行。通过这样的表,您可以将其他(可能是非标准的)信息附加到日期。例如,您的公司可能会使用6周的报告期,您无法使用TO_CHAR / TO_DATE提取。预先计算并将其存储在此表中。

哦,Oracle 11g具有自动分区管理功能。如果你坚持使用10g,那么你可能对这篇文章感兴趣吗? Automatic Partition Management for Oracle 10g

答案 1 :(得分:1)

最好的方法是将行生成器与日期函数分开。因此,生成一个从0到6的列表,并从中计算月数。如果你想通过几个月,那么在with子句

中做
with my_counter as (
  Select Level-1 as id 
  from dual 
  connect by Level <= 7
) 
select to_char(add_months(sysdate, id),'YYYYMM') from my_counter

以下示例将允许您插入计算差异所需的日期。

with my_counter as (
  Select Level-1 as id 
  from dual 
  connect by level <= months_between(add_months(trunc(sysdate,'MM'), 6), 
      trunc(sysdate,'MM')) + 1
) 
select to_char(add_months(trunc(sysdate, 'MM'), id),'YYYYMM') from my_counter

答案 2 :(得分:0)

试试这个:

with numbers as
( select level as n from dual
  connect by level <= 7
)
select to_char (add_months (trunc(sysdate,'MM'), n-1), 'YYYYMM') id
from numbers;

ID
------
201012
201101
201102
201103
201104
201105
201106