Как я могу узнать, сколько номеров недель в заданном интервале времени в T-SQL - PullRequest
0 голосов
/ 14 июня 2019

Я немного застрял здесь, я хочу найти все номера недели за определенный промежуток времени, и я не могу понять это

Например, вместо - > datepart(week,dateadd(day,-1,@oneSingleDate)) (понедельник - первый день недели),

Мне нужно что-то вроде

- > datepart(week,@startDate,@endDate) 

Учитывая интервал '2019-01-04'-'2019-01-28', вывод должен быть:

Номер недели: 1,2,3,4,5.

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Вы можете сделать это следующим образом: с помощью : - [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]
0 голосов
/ 14 июня 2019

Я использовал рекурсивный 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...