获取月末日期的日期范围

时间:2017-08-30 03:43:40

标签: sql oracle date-range

我有一个表格,它会给我姓名和开始日期。使用这个我需要从开始日期到日期获取包含姓名和月结束日期行的记录。 我的基本表格如下所示

Name    | Start_date
Fly     | 01-Jul-16

我的输出如下

Name    Start_date
Fly| 31-Jul-16
Fly 31-Aug-16
Fly 30-Sep-16
Fly 31-Oct-16
Fly 30-Nov-16
Fly 31-Dec-16
Fly 31-Jan-17
Fly 28-Feb-17
Fly 31-Mar-17
Fly 30-Apr-17
Fly 31-May-17
Fly 30-Jun-17
Fly 31-Jul-17
Fly 31-Aug-17

我尝试了几个按层次使用连接并使用了最后一天函数的东西,但是该表没有加入基本表的名称。我的表中有超过100个名称。请求指导。< / p>

1 个答案:

答案 0 :(得分:2)

如果您有多个名称和一个日期,以下是如何执行此操作,但仅当输入名称不同时才有效。 (否则可以修改查询以适应非唯一名称。)

奇怪您希望将月末日期称为start_date,与输入数据中的相同。此外,name是Oracle关键字,不应将其用作列名。我会让你处理这两个问题。

with
     test_data ( name, start_date ) as (
       select 'Fly', to_date('01-Jul-16', 'dd-Mon-yy') from dual union all
       select 'Two', to_date('15-Feb-17', 'dd-Mon-yy') from dual
     )
-- End of simulated inputs (for testing only, not part of the solution).
-- Use your actual table and column names in the SQL below.
select     name, add_months(last_day(start_date), level - 1) as start_date
from       test_data
connect by add_months(last_day(start_date), level - 1) <= last_day(sysdate)
       and prior name = name
       and prior sys_guid() is not null
order by   name, start_date
;

<强>输出

NAME  START_DATE
---   ----------
Fly   31-Jul-16 
Fly   31-Aug-16 
Fly   30-Sep-16 
Fly   31-Oct-16 
Fly   30-Nov-16 
Fly   31-Dec-16 
Fly   31-Jan-17 
Fly   28-Feb-17 
Fly   31-Mar-17 
Fly   30-Apr-17 
Fly   31-May-17 
Fly   30-Jun-17 
Fly   31-Jul-17 
Fly   31-Aug-17 
Two   28-Feb-17 
Two   31-Mar-17 
Two   30-Apr-17 
Two   31-May-17 
Two   30-Jun-17 
Two   31-Jul-17 
Two   31-Aug-17