Данные за недели предыдущего месяца - PullRequest
1 голос
/ 22 октября 2019

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

Вместо этого:

SELECT
wadat_ist AS 'frame'
,CASE
WHEN wadat_ist BETWEEN '2019-09-01' AND '2019-09-01' THEN 'MA1'
WHEN wadat_ist BETWEEN '2019-09-02' AND '2019-09-08' THEN 'MA2'
WHEN wadat_ist BETWEEN '2019-09-09' AND '2019-09-15' THEN 'MA3'
WHEN wadat_ist BETWEEN '2019-09-16' AND '2019-09-22' THEN 'MA4'
WHEN wadat_ist BETWEEN '2019-09-23' AND '2019-09-30' THEN 'MA5'
END AS 'Activity'

Я пробовал это:

SELECT
wadat_ist AS 'frame'
,CASE
WHEN wadat_ist BETWEEN (SELECT (Convert (DATETIME, (SELECT DATEADD(DAY,1,EOMONTH(GETDATE(),-2)))))) AND  (SELECT DateAdd (wk, 0, (select DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, +0.99999)))) THEN 'MA1'
WHEN wadat_ist BETWEEN (SELECT DateAdd (wk, -4, (SELECT DATEADD(day,-1,DATEadd(MONTH,datediff(month,0,GETDATE()),0))))) AND (SELECT DateAdd (wk, 1, (select DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0)))) THEN 'MA2'
WHEN wadat_ist BETWEEN (SELECT DateAdd (wk, -3, (SELECT DATEADD(day,-1,DATEadd(MONTH,datediff(month,0,GETDATE()),0))))) AND (SELECT DateAdd (wk, 2, (select DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0)))) THEN 'MA3'
WHEN wadat_ist BETWEEN (SELECT DateAdd (wk, -2, (SELECT DATEADD(day,-1,DATEadd(MONTH,datediff(month,0,GETDATE()),0))))) AND (SELECT DateAdd (wk, 3, (select DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0)))) THEN 'MA4'
WHEN wadat_ist BETWEEN (SELECT DateAdd (wk, -1, (SELECT DATEADD(day,-1,DATEadd(MONTH,datediff(month,0,GETDATE()),0))))) AND (SELECT DateAdd (wk, 4, (select DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0)))) THEN 'MA5'
END AS 'Activity'

Но результаты совсем другие. Значения с первой недели находятся на второй неделе, значения со второй недели - на третьей и т. Д. ... все недели как-то сдвигаются ... Далее первая неделя (MA1) помечается как NULL, но его значения должны переходить на последнюю неделю(MA5).

Плюс я нахожу этот, но он насчитывает несколько недель в один, но со временем он соответствует недельной неделе, так что, возможно, первое ноября будет хорошо, но яскорее нужно что-то, что будет показывать данные в любое время в месяц.

WHEN wadat_ist BETWEEN (select DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0)) AND (select dateadd(wk, datediff(wk, 5, getdate()) - 5, 6)) THEN 'MA1'
WHEN wadat_ist BETWEEN (select dateadd(wk, datediff(wk, 4, getdate()) - 4, 0)) AND (select dateadd(wk, datediff(wk, 4, getdate()) - 4, 6)) THEN 'MA2'
WHEN wadat_ist BETWEEN (select dateadd(wk, datediff(wk, 3, getdate()) - 3, 0)) AND (select dateadd(wk, datediff(wk, 3, getdate()) - 3, 6)) THEN 'MA3'
WHEN wadat_ist BETWEEN (select dateadd(wk, datediff(wk, 2, getdate()) - 2, 0)) AND (select dateadd(wk, datediff(wk, 2, getdate()) - 2, 6)) THEN 'MA4'
WHEN wadat_ist BETWEEN (select dateadd(wk, datediff(wk, 1, getdate()) - 1, 0)) AND (SELECT EOMONTH(getdate(),-1)) THEN 'MA5'

Использование T-SQL

Ответы [ 2 ]

1 голос
/ 22 октября 2019

В качестве одного из решений вы можете создать TimeTable в своей базе данных или временной таблице с вашим диапазоном времени, а затем сгенерировать столбец WeekOfMonth:
1. создать таблицу хотя бы с этими столбцами (дата, год, месяц,неделя, квартал: используйте DATEPART)
2. сгенерируйте свой столбец:

WeekOfMonth = DENSE_RANK() OVER (PARTITION BY [year], [month] ORDER BY [week])



Если вы создадите правильное расписание, это будет полезно для будущих задач.

0 голосов
/ 22 октября 2019

Попробуйте ниже (частичный) запрос, комментарии встроены:

-- set monday as first day of week
set datefirst 1;

-- after checking, that 1 of september is 35th week of year, you can do the following:
select case when datepart(week, wadat_ist) = 35 then 'MA1'
            when datepart(week, wadat_ist) = 36 then 'MA2'
            when datepart(week, wadat_ist) = 37 then 'MA3'
            when datepart(week, wadat_ist) = 38 then 'MA4'
            when datepart(week, wadat_ist) = 39 then 'MA5'
       end as 'Activity'

или короче

select case datepart(week, wadat_ist) 
            when 35 then 'MA1'
            when 36 then 'MA2'
            when 37 then 'MA3'
            when 38 then 'MA4'
            when 39 then 'MA5'
       end as 'Activity'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...