Oracle:在两个日期之间的月份中创建范围

托比

我有下表:如果需要,我也有日历表。

ID    Start_dt          End_dt
 1      1/9/2016         3/10/2016

预期产量:

ID    Start_dt      End_dt         Month   ActiveCustomerPerMonth
 1      1/9/16       3/10/2016    201601         1
 1      1/9/16       3/10/2016    201602         1
 1      1/9/16       3/10/2016    201603         0 (Not Active end of Month)

我需要这个,因为我正在处理当前查询,该查询将使用案例语句来计算该月客户是否活跃。如果该成员在该月的最后一天处于活动状态,则该成员将被视为该月的活动成员。但是我需要能够为该客户算数个月的时间。

  CASE 
     WHEN LAST_DAY(x.END_DT) = x.END_DT
       THEN '1'
     WHEN  TO_CHAR(X.END_DT,'MM/DD/YYYY') != '01/01/3000' 
       OR X.DISCHARGE_REASON IS NOT NULL 
        THEN '0'   
     WHEN X.FIRST_ASSGN_DT IS NULL
        THEN '0'      
   ELSE '1'
    END ActiveMemberForMonth

我是Oracle的新手,正在阅读有关connect by的文章,但不了解该过程,也不确定这是否是合适的使用场所。

数学家

这样的事情。

with
     test_data ( id, start_dt, end_dt ) as (
       select 1, to_date('1/9/2016' , 'mm/dd/yyyy'), to_date('3/10/2016', 'mm/dd/yyyy') 
                                                                       from dual union all
       select 2, to_date('1/23/2016', 'mm/dd/yyyy'), to_date('5/31/2016', 'mm/dd/yyyy') 
                                                                       from dual
     )
--  end of test data; solution (SQL query) begins below this line
select id, start_dt, end_dt,
       to_char(add_months(trunc(start_dt, 'mm'), level - 1), 'yyyymm') as mth,
       case when end_dt < last_day(end_dt) 
             and level  = 1 + months_between(trunc(end_dt, 'mm'), trunc(start_dt, 'mm'))
            then 0 else 1 end as active_at_month_end
from   test_data
connect by level <= 1 +  months_between(trunc(end_dt, 'mm'), trunc(start_dt, 'mm'))
       and prior id = id
       and prior sys_guid() is not null
order by id, mth  --  optional
;

 ID START_DT   END_DT     MTH    ACTIVE_AT_MONTH_END
--- ---------- ---------- ------ -------------------
  1 2016-01-09 2016-03-10 201601                   1
  1 2016-01-09 2016-03-10 201602                   1
  1 2016-01-09 2016-03-10 201603                   0
  2 2016-01-23 2016-05-31 201601                   1
  2 2016-01-23 2016-05-31 201602                   1
  2 2016-01-23 2016-05-31 201603                   1
  2 2016-01-23 2016-05-31 201604                   1
  2 2016-01-23 2016-05-31 201605                   1

8 rows selected.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

JavaScript:获取两个日期之间的所有月份?

JavaScript中两个日期之间的月份差异

查找两个日期之间的月份的最佳方法

两个日期之间月份的差异

乔达时间-两个日期之间的月份差

oracle或db2中两个表之间的合并日期范围

获取两个日期之间的所有月份

如何获得两个日期之间的月份集合?

sparql获取两个日期之间的所有月份

python中两个日期范围之间的重叠日期

计算Unix中两个日期之间的月份差异?

在VBA中创建两个日期之间的间隔列表

如何计算Oracle中两个日期之间的of年数?

在两个日期之间扩展月份

如何计算oracle中两个日期之间的天数?

如何在Oracle SQL中获得两个日期之间的月份

查找两个日期之间的月份和日期差异

如何获得两个日期之间的月份

SQL查询以获取两个日期之间月份的日期范围列表

在TSQL中获取两个日期之间的月份

如何获得两个日期之间的所有月份?

在MYSQL中获取两个日期范围之间的记录

在目录中搜索在两个日期之间创建的文件

如何在不同客户端的不同范围内获取 SQL-oracle 中两个日期之间的所有月份

如何在oracle中获取特定月份的两个日期之间的日期列表

在 Rails 中查找两个日期之间的月份

有两个日期。如何创建这些日期之间的月份间隔列表?

在codeigniter中获取两个日期范围之间的数据

Oracle sql - 获取两个日期之间的月份 ID