#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 является рекурсивным, поэтому в некотором роде больше похож на aWHILE
, но это, по крайней мере, один оператор, а не много, поэтому они тоже чаще всего более производительны, чем его итеративный «друг».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 если мой ответ решил вашу проблему, пожалуйста, отметьте его как принятый ответ (и при необходимости проголосуйте за него). Спасибо