【问题标题】:Oracle SQL Need list of first and last day of months after a dateOracle SQL 需要某个日期后月份的第一天和最后一天的列表
【发布时间】:2018-11-08 16:52:24
【问题描述】:

我希望有一个更优雅的查询,该查询从只读数据库中生成一个日期之后的所有月份的第一天和该月最后一天的列表,例如 01/01/2013日期表。我的解决方案有效,但它困扰着我。

我提前为我的蛮力解决方案道歉,但这是我今天使用的 sn-p。

select ((add_months(trunc(sysdate,'mm'),-1))) as FirstDOM, (last_day(add_months(trunc(sysdate,'mm'),-1))) as LASTDOM from dual union ALL 
select ((add_months(trunc(sysdate,'mm'),-2))), (last_day(add_months(trunc(sysdate,'mm'),-2))) from dual union ALL
select ((add_months(trunc(sysdate,'mm'),-3))), (last_day(add_months(trunc(sysdate,'mm'),-3))) from dual union ALL
select ((add_months(trunc(sysdate,'mm'),-4))), (last_day(add_months(trunc(sysdate,'mm'),-4))) from dual union ALL
select ((add_months(trunc(sysdate,'mm'),-5))), (last_day(add_months(trunc(sysdate,'mm'),-5))) from dual union ALL
select ((add_months(trunc(sysdate,'mm'),-6))), (last_day(add_months(trunc(sysdate,'mm'),-6))) from dual union ALL
select ((add_months(trunc(sysdate,'mm'),-7))), (last_day(add_months(trunc(sysdate,'mm'),-7))) from dual union ALL
select ((add_months(trunc(sysdate,'mm'),-8))), (last_day(add_months(trunc(sysdate,'mm'),-8))) from dual union ALL
select ((add_months(trunc(sysdate,'mm'),-9))), (last_day(add_months(trunc(sysdate,'mm'),-9))) from dual union ALL
select ((add_months(trunc(sysdate,'mm'),-10))), (last_day(add_months(trunc(sysdate,'mm'),-10))) from dual union ALL
select ((add_months(trunc(sysdate,'mm'),-11))), (last_day(add_months(trunc(sysdate,'mm'),-11))) from dual union ALL
select ((add_months(trunc(sysdate,'mm'),-12))), (last_day(add_months(trunc(sysdate,'mm'),-12))) from dual union ALL
select ((add_months(trunc(sysdate,'mm'),-13))), (last_day(add_months(trunc(sysdate,'mm'),-13))) from dual union ALL
select ((add_months(trunc(sysdate,'mm'),-14))), (last_day(add_months(trunc(sysdate,'mm'),-14))) from dual) fldom 

但这实际上持续了 60 个月。
谢谢!

【问题讨论】:

    标签: oracle date


    【解决方案1】:

    分层查询以简单的方式完成此操作。这是一个例子:

    SQL> alter session set nls_date_format = 'dd.mm.yyyy';
    
    Session altered.
    
    SQL> set ver off
    SQL> with test (col) as
      2    (select date '2013-01-01' from dual),
      3  all_months as
      4    (select add_months(col, level - 1) mon
      5     from test
      6     connect by level <= &number_of_months
      7    )
      8  select trunc(mon, 'mm') first_day,
      9    last_day(mon) last_day
     10  from all_months
     11  order by 1;
    Enter value for number_of_months: 15
    
    FIRST_DAY  LAST_DAY
    ---------- ----------
    01.01.2013 31.01.2013
    01.02.2013 28.02.2013
    01.03.2013 31.03.2013
    01.04.2013 30.04.2013
    01.05.2013 31.05.2013
    01.06.2013 30.06.2013
    01.07.2013 31.07.2013
    01.08.2013 31.08.2013
    01.09.2013 30.09.2013
    01.10.2013 31.10.2013
    01.11.2013 30.11.2013
    01.12.2013 31.12.2013
    01.01.2014 31.01.2014
    01.02.2014 28.02.2014
    01.03.2014 31.03.2014
    
    15 rows selected.
    
    SQL>
    

    仅举个例子,我选择显示 15 个月。您可以使用其他值,或者是固定值(60 - 您提到的值),或者是计算值(例如使用MONTHS_BETWEEN)。

    【讨论】:

    • 那是一件美好的事情!非常感谢!!不幸的是,我在我的组织中扮演了如此多的角色,以至于我从来没有真正擅长任何事情——只是在一堆事情上平庸。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    相关资源
    最近更新 更多