Почему мой запрос недели года показывает «2022.52», когда он должен показывать «2021.52»?

#sql #sql-server #tsql

Вопрос:

У меня есть запрос, который дал мне все 12 следующих недель :

       insert #T_period_futur
               (TPF_year,
                TPF_period_number,
                TPF_start_period,
                TPF_end_period
               )
         select year(dateadd(month, @period_number *  1-1, @next_end_month)),
          convert(varchar(4), case when datepart(ISO_WEEK, dateadd(week, @period_number *  1, @next_sunday)) < 53
                                      then year(dateadd(week, @period_number *  1, @next_sunday))
                                      else year(dateadd(week, @period_number *  1, @next_sunday)) - 1
                                    end) 
                  '.'   right('00'   convert(varchar(4), datepart(ISO_WEEK, dateadd(week, @period_number -1, @next_sunday))), 2),
               dateadd(week, @period_number *  1, dateadd(day, (datepart(weekday, @today)-1) * -1 - 7 1, @today)),
             dateadd(week, @period_number -1, DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 6))
               ;
 

Я вызываю его внутри цикла while, который выполняет это :

 while @period_number <= @nb_period
begin 

 --The previous query..
   select @period_number = @period_number   1;

end;
 

С @period_number = 1 помощью и @nb_period = 12

Но результат не тот, который ожидался, как вы можете видеть :

введите описание изображения здесь

Предполагается, что недели 51 и 52 относятся к 2021 году, а не к 2022 году.

Ожидаемые результаты :

введите описание изображения здесь

Что я делаю не так?

Комментарии:

1. Вам было бы лучше сделать это на основе набора, например, с помощью таблицы подсчета и CTE.

2. у вас есть какой-нибудь пример?

3. TPF_year и TPF_period_number , похоже, не синхронизированы. Ожидается ли, что TPF_year = 2022 начинается с TPF_period_id > = 4?

4. A WHILE редко бывает правильным решением, @LouisChopard, не говоря уже о «лучшем» решении в SQL. SQL — это язык, основанный на наборе, и подсчет устанавливается на основе. rCTE является рекурсивным, поэтому в некотором роде больше похож на a WHILE , но это, по крайней мере, один оператор, а не много, поэтому они тоже чаще всего более производительны, чем его итеративный «друг».

5. Вам было бы лучше показать нам результаты, которые вы хотите, и образцы данных. У нас есть результаты, которые вы получаете (в виде изображения), но мы не знаем, какие результаты вам нужны; нам сложно ответить на этот вопрос, когда мы не знаем, каково конечное решение.

Ответ №1:

Этот запрос возвращает то, что вам нужно:

 with T_period_futur  
AS
(
    SELECT 1 AS TPF_period_id, cast('25/10/21' as date) as TPF_start_period
    UNION ALL
    SELECT TPF_period_id   1 as TPF_period_id, dateadd(week, 1, TPF_start_period) FROM T_period_futur WHERE TPF_period_id <12
)
select 
    TPF_period_id,
    YEAR(TPF_start_period) as TPF_year,
    cast(YEAR(TPF_start_period) as varchar)   '.'   RIGHT('00' cast(datepart(wk,TPF_start_period)-1  as varchar),2) as TPF_period_number,
    TPF_start_period,
    DATEADD(d, 6, TPF_start_period) as TPF_end_period
from T_period_futur;
 

SQL Скрипка: http://sqlfiddle.com /#!18/9eecb/141635

Результаты:

 | TPF_period_id | TPF_year | TPF_period_number | TPF_start_period | TPF_end_period |
|---------------|----------|-------------------|------------------|----------------|
|             1 |     2021 |           2021.43 |       2021-10-25 |     2021-10-31 |
|             2 |     2021 |           2021.44 |       2021-11-01 |     2021-11-07 |
|             3 |     2021 |           2021.45 |       2021-11-08 |     2021-11-14 |
|             4 |     2021 |           2021.46 |       2021-11-15 |     2021-11-21 |
|             5 |     2021 |           2021.47 |       2021-11-22 |     2021-11-28 |
|             6 |     2021 |           2021.48 |       2021-11-29 |     2021-12-05 |
|             7 |     2021 |           2021.49 |       2021-12-06 |     2021-12-12 |
|             8 |     2021 |           2021.50 |       2021-12-13 |     2021-12-19 |
|             9 |     2021 |           2021.51 |       2021-12-20 |     2021-12-26 |
|            10 |     2021 |           2021.52 |       2021-12-27 |     2022-01-02 |
|            11 |     2022 |           2022.01 |       2022-01-03 |     2022-01-09 |
|            12 |     2022 |           2022.02 |       2022-01-10 |     2022-01-16 |
 

Комментарии:

1. @LouisChopard если мой ответ решил вашу проблему, пожалуйста, отметьте его как принятый ответ (и при необходимости проголосуйте за него). Спасибо