Разделить диапазон по месяцам (понедельник-пятница) в SQL Server - PullRequest
0 голосов
/ 06 декабря 2018

Я использую SQL Server 2008R2 и пытаюсь разделить заданный месяц по недельным диапазонам.Я получил следующее решение.Но я хочу, чтобы дней между (пн-пт) не было (вс-сб).Как я могу это сделать?

DECLARE @start_date DATETIME, @end_date DATETIME
DECLARE @Table table(StartDate datetime,Enddate datetime,WeekNo int)

SET @start_date = '1 Dec 2018'
SET @end_date =   '31 Dec 2018'

INSERT @Table 
SELECT MIN(dt), MAX(dt), w
FROM
(
    SELECT dt, year(dt) y, DATEPART(week,dt) w
    FROM
    (
        SELECT @start_date + (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1) dt
        FROM sys.columns s1 cross join sys.columns s2
    ) q
    WHERE dt BETWEEN @start_date AND @end_date
) a
group by y,w

Select * from @Table order by startdate, weekno

1 Ответ

0 голосов
/ 06 декабря 2018

Один из вариантов - генерировать только записи и получать даты понедельника между @start_date и @end_date

После этого убедитесь, что граничные условия учитываются для

DECLARE @start_date DATETIME, @end_date DATETIME
DECLARE @Table table(StartDate datetime,Enddate datetime,WeekNo int)

SET @start_date = '1 Nov 2018'
SET @end_date =   '30 Nov 2018'

set datefirst 1;

INSERT @Table 
     SELECT dt as start_of_week
           ,dateadd(dd,4,dt) as end_of_week
           ,DATEPART(week,dt) w
           ,datepart(dw,q.dt)
      FROM
      (
        SELECT @start_date + (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1) dt              
          FROM sys.columns s1 cross join sys.columns s2
       ) q
    WHERE dt BETWEEN @start_date AND @end_date
     AND datepart(dw,q.dt)=1 /*Gets only the days beginning from monday*/
     --AND dateadd(dd,4,q.dt) <= @end_date /*Ignore any records which cross over the @end_date*/

Select * from @Table order by startdate, weekno
...