Я немного застрял здесь, я хочу найти все номера недели за заданный промежуток времени, и я не могу понять это
Например, вместо
- > datepart(week,dateadd(day,-1,@oneSingleDate))
(понедельник - первый день недели) ,
мне нужно что-то вроде
- > datepart(week,@startDate,@endDate)
Учитывая интервал '2019-01-04'-'2019-01-28'
, вывод должен быть:
Неделя № : 1,2,3,4,5
.
Присоединяйтесь к таблице календаря с помощью между и получить номера недель.
Возможный дубликат Как Stuff и «For Xml Path» работают на сервере Sql
Просто объедините оба повторяющихся вопроса/ответа для запроса, который даст вам правильный набор результатов, в SQL Server 2017 вы можете использовать STRING_AGG() вместо STUFF
я использовал рекурсивный CTE для генерации всех дат в диапазоне, затем я выбрал из них номера недели DISTINCT, используя DATEPART. Затем я объединил затем вашу строку, разделенную запятыми, в переменную с именем @OUT
DECLARE @startDate as date = '20190104';
DECLARE @endDate as date = '2019-01-28';
DECLARE @OUT as nvarchar(max);
WITH CTE AS (SELECT @startDate As X
UNION ALL
SELECT DATEADD(y, 1, X) X FROM CTE where x < @endDate),
CTE2 AS (SELECT DISTINCT datepart(wk, X) wk from cte)
select @out = coalesce(@out + ', ', '') + cast(wk as nvarchar(4)) from cte2
OPTION (MAXRECURSION 0);
select @out;
Вы можете сделать это следующим образом: с использованием : - [CTE][1] общее табличное выражение - [Объединение рекурсии Sql все][2] - [Объединение нескольких строк в одну строку][3]
declare @startDate as date ;
declare @endDate as date ;
set @startDate='2019-01-04';
set @endDate='2019-01-28' ;
DECLARE @weeks VARCHAR(8000) ;
with cte as (select @startDate as mydate,datepart(week,@startDate) w
union all select
dateadd(day,1,mydate),datepart(week,dateadd(day,1,mydate)) from cte
where mydate < @endDate) , cte2 as (select distinct(w) from cte)
select @weeks=COALESCE(@weeks + ', ', '') +cast(w as varchar(2)) from
cte2 OPTION (MAXRECURSION 360) select @weeks [Result]
Возможный дубликат SQL Server 2008 Генерация серии дат и времени