好的,我是新用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。
答案 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