Найти следующую дату на основе интервала (месяц / квартал) - PullRequest
0 голосов
/ 10 ноября 2019
CREATE TABLE @Temp(
    Date datetime,
    Flag bit)

@Temp table as data from 01-04-2019  to  31-04-2020  (366 records) and flag=0

DECLARE startdate date='12-04-2019', interval  int  =1 OR 3

Ожидаемый результат: Если интервал равен 1 месяцу, на основе начальной даты, флаг должен быть обновлен как 1 под записями и остаток для 0

    date         flag
    01-04-2019    0
    .             0
    .             0
    12-05-2019    1
    .             0
    .             0  
    12-06-2019    1
    .             0
    .             0
    12-07-2019    1
    ..            0
    31-04-2020    0

Если интервал равен 3 месяцам, флаг должен быть обновленкак 1 за квартал

      date        flag
    01-04-2019    0
    .             0
    .             0
    12-07-2019    1
    .             0
    .             0  
    12-10-2019    1
    .             0
    .             0
    12-01-2020    1
    .             0
    31-04-2020    0

Я застрял, пытаясь получить результат. Я использую SQL Server 2017.

1 Ответ

2 голосов
/ 10 ноября 2019

Мне потребовалось некоторое время, чтобы понять, что ваши даты были в другом формате, чем я привык.

Я бы использовал общее табличное выражение, а не курсор. Кроме того, рассмотрите разницу в месяце между любой датой и датой начала. Возьмем модуль этой разницы (это символ «%»). Если это 0, то ваш интервал был достигнут, и поэтому активируйте свой флаг.

declare 
    @startdate date = '04.01.2019',
    @interval int = 3; -- or 1, or whatever

with

    dates as (

        select      @startdate dt, 1 flag

        union all
        select      ap.nextDt, 

                    flag = 
                        case
                        when day(ap.nextDt) <> day(@startdate) then 0 
                        when (month(ap.nextDt) - month(@startdate)) % @interval = 0 then 1
                        else 0 
                        end

        from        dates
        cross apply (select nextDt = dateadd(day,1,dt)) ap
        where       dt <= dateadd(year,1,@startdate)

    )

    select    *           
    from      dates 
    option    (maxrecursion 367)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...