代码之家  ›  专栏  ›  技术社区  ›  jonyfries

在任何行的开始日期和结束日期之间选择日期

  •  0
  • jonyfries  · 技术社区  · 7 年前

    我正在使用下面显示的方法创建月份列表: Months between two dates

    一旦我有了这些日期,我就只想保留那些介于特定客户的任何行的开始日期和结束日期之间的日期。

    所以这张桌子是:

    client  start_date  end_date
    1       2014-06-01  2016-02-29
    1       2016-03-01  2016-12-31
    1       2017-04-01  NULL
    

    其中,空表示在没有未来结束日期集的情况下仍处于活动状态。

    所以我想得到的是(我每个月都用eomonth):

    2014-06-30
    2014-07-31
    ... ect ...
    2016-11-30
    2016-12-31
    2017-04-30
    2017-05-31
    ... ect ...
    

    因此,2016年12月至2017年4月之间的月份并不存在。每个客户机可以有任意数量的行。它们可能没有间隙,也可能有间隙,如上所述。

    1 回复  |  直到 7 年前
        1
  •  0
  •   jonyfries    7 年前

    所以我现在觉得有点傻!很简单:

    WITH dates AS (
    SELECT  EOMONTH(DATEADD(MONTH, x.number, '2016-01-01')) calendar_month
    FROM    master.dbo.spt_values x
    WHERE   x.type = 'P'        
        AND x.number <= DATEDIFF(MONTH, '2016-01-01', '2018-12-31'))
    
    SELECT
        dates.calendar_month
    
    FROM
        clients
        LEFT JOIN dates ON dates.calendar_month BETWEEN EOMONTH(clients.start_date) AND EOMONTH(clients.end_date) OR 
            (dates.calendar_month >= clients.start_date AND clients.end_date is NULL)