【问题标题】:connected by months按月连接
【发布时间】:2010-12-07 10:58:08
【问题描述】:

好的,我是新来使用 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.

【问题讨论】:

  • 在 PL/SQL 中使用循环自动执行此操作会容易得多,而且可维护性也会好得多。

标签: oracle list date


【解决方案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】:

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

    哦,Oracle 11g 具有自动分区管理功能。如果你被 10g 卡住了,那么这篇文章你可能会感兴趣? Automatic Partition Management for Oracle 10g

    【讨论】:

    • 这太棒了!非常感谢。不幸的是,我被困在 10g 中,而且我不是(呵呵,因为我的新手很明显)DBA,所以无法访问这些东西。无论如何,感谢您的提醒。 +1!
    【解决方案3】:

    试试这个:

    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
    

    【讨论】:

    • 直截了当。谢谢老兄。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 2021-12-29
    相关资源
    最近更新 更多