使用Proc SQL中的日期范围计算某个条目在特定月份内的活动天数

使用Proc SQL中的日期范围计算某个条目在特定月份内的活动天数,sql,sql-server,date,cartesian-product,proc-sql,Sql,Sql Server,Date,Cartesian Product,Proc Sql,我在一段时间内获得了一些数据,但在了解一些细节方面遇到了困难 例如,我有大量的数据行,其中包含活动开始和停止日期。如果发生以下三种情况之一,我已执行笛卡尔乘积将我的特定数据行连接到该特定月份: 项目活动开始日期发生在该特定月份的第一天之前,而该项目的活动停止日期发生在该月份的第一天之后。项目开始=日历月开始 项目活动开始日期发生在该特定月份的第一天之后,并且该项目的活动停止日期发生在该特定月份活动的最后一天之前。项目开始日期>=日历月开始日期,项目停止日期>=日历月结束日期 项目活动开始日期在该

我在一段时间内获得了一些数据,但在了解一些细节方面遇到了困难

例如,我有大量的数据行,其中包含活动开始和停止日期。如果发生以下三种情况之一,我已执行笛卡尔乘积将我的特定数据行连接到该特定月份:

项目活动开始日期发生在该特定月份的第一天之前,而该项目的活动停止日期发生在该月份的第一天之后。项目开始=日历月开始 项目活动开始日期发生在该特定月份的第一天之后,并且该项目的活动停止日期发生在该特定月份活动的最后一天之前。项目开始日期>=日历月开始日期,项目停止日期>=日历月结束日期 项目活动开始日期在该特定月份的最后一天之前,并在该特定月份的最后一天之后停止。项目开始=日历月 my proc sql查询的一个示例:

proc sql;
create table  earned_activity as

select
      a.ITEM_START,
      a.ITEM_STOP,
      b.MonthName,
      b.CalendarMonthStart,
      b.CalendarMonthEnd
/* Need to do something here */
from item_activity as a
left join calendar_table as b on 
          (ITEM_START<= CalendarMonthStart and ITEM_STOP>= CalendarMonthStart) or
          (ITEM_START>= CalendarMonthStart and ITEM_STOP>= CalendarMonthEnd) or
          (ITEM_START<= CalendarMonthEnd and ITEM_STOP>= CalendarMonthEnd)

;
quit;
将这三个案例与我的数据合并后,我有一些示例数据,如下所示:

项目(开始) 项目(停止) 蒙特纳姆 日历月开始 蒙特亨德日历酒店 活动天数 2021-01-06 2021-03-06 简 2021-01-01 2021-01-31 25 2021-01-06 2021-03-06 二月 2021-02-01 2021-02-28 28 2021-01-06 2021-03-06 破坏 2021-03-01 2021-03-31 6.
我想,你们只需要起点的最大值和终点的最小值

选择 今天, 当CalendarMonthStart>a.ITEM\u开始,然后CalendarMonthStart其他a.ITEM\u开始结束时, 当CalendarMonthEnd 内部连接日历\u表为b on 项目\开始日历月开始
杰出的我将对此进行测试,看看会发生什么。更好的地方条件建议。谢谢你。我认为这很有效。在第二种情况下,我认为else子句应该是a.ITEM\u STOP\u DT。此外,在连接的where子句中,它们应该在条件中包含等效的情况,因为项目可以在monthstart/monthend停止/开始,并且我们仍然希望将这一天计算为活动日期。如果是这种情况,则您需要>=和您编写的逻辑,如果某个项目的开始时间在日历月开始时间之后或等于日历月开始时间,而该项目的停止时间在日历月开始时间之前,并且该项目基本上只在该月内有活动,则您的逻辑将导致datediff取该项目与该项目之间的天数差,结果为0天,但事实上,它应该找到它从项目开始到项目结束存在的天数?