标记后续月份的日期超过一个月

时间:2018-04-03 13:50:59

标签: tsql sql-server-2016

我有两张桌子:

  1. 订单 - 将使用开始日期和结束日期存储持续时间
  2. 日历 - 包含所有日期的维度表。

        create table #orders
        (
            order_id int identity(1,1) primary key
            ,start_date date
            ,end_date date
        )
    
        insert into #orders
        (
            start_date
            ,end_date
        )values('2018-01-05','2019-02-04'),('2018-03-15','2019-07-14')  
    
        create table #calendar_dates
        (
            [date] date
        )
    
        ;WITH calendar
            AS (SELECT dates = CONVERT(date, '2018-01-01' )
                UNION ALL
                SELECT dates = Dateadd(DAY, 1, dates)
                FROM   calendar
                WHERE  dates < ='2020-12-31' 
                )
        insert into #calendar_dates
        (
            date
        )  
        select 
            c.dates  
        from
            calendar c
            OPTION( MAXRECURSION 0)
    
    
        select * from #orders
    
        select * from #calendar_dates
    
  3. 对于每个订单,如果日历日期超过该日期,我需要使用指示符表示已完成的月份来掩盖额外的列。

    例如:输出应如下所示:

            calendar_date      order_id     start_date      end_date        is_month
            -------------------------------------------------------------------------
            2018-01-01             1        2018-01-01      2019-02-04        1
            2018-01-02             1        2018-01-01      2019-02-04        0
            2018-01-03             1        2018-01-01      2019-02-04        0
            .
            .
            .
            .
            .
            .
            .
            2018-02-01             1        2018-01-01      2019-02-04        1
            .
            .
            2018-03-01             1        2018-01-01      2019-02-04        1
            .
            .
            2018-04-01             1        2018-01-01      2019-02-04        1
            .
            .
            2018-05-01             1        2018-01-01      2019-02-04        1
    

1 个答案:

答案 0 :(得分:2)

您是否需要为每个订单标记每个月的开头?

SELECT
    T.date,
    O.order_id,
    O.start_date,
    O.end_date,
    is_month = CASE WHEN DATEPART(DAY, T.date) = 1 THEN 1 ELSE 0 END
FROM
    #calendar_dates AS T
    INNER JOIN #orders AS O ON T.date BETWEEN O.start_date AND O.end_date
ORDER BY
    O.order_id,
    T.date