Группировка диапазона дат по неделям
-
06-09-2019 - |
Вопрос
У меня есть диапазон дат, в котором дата начала на 2 года раньше сегодняшнего дня.например) «29.05.2007» ~ «29.05.2009».
Как я могу выйти за указанный выше диапазон дат, чтобы получить список, подобный следующему?
(дата начала начинается с «27.05.2007», а не с «29.05.2007», поскольку начало рабочего дня — воскресенье, а «27.05.2007» — первый день недели для «29.05.2007»). и то же самое рассуждение для последней EndDate, 30.05.2009, то есть субботы)
StartDate EndDate
05/27/2007 06/02/2007
06/03/2007 06/09/2007
...
05/24/2009 05/30/2009
[ОБНОВЛЯТЬ] вот мой последний вопрос
WITH hier(num, lvl) AS (
SELECT 0, 1
UNION ALL
SELECT 100, 1
UNION ALL
SELECT num + 1, lvl + 1
FROM hier
WHERE lvl < 100
)
SELECT num, lvl,
DATEADD(dw, -DATEPART(dw, '2007-05-29'), '2007-05-29') + num * 7,
DATEADD(dw, -DATEPART(dw, '2007-05-29'), '2007-05-29') + (num + 1) * 7
FROM hier
where num <= 104 --; 52 weeks/year * 2
ORDER BY num
Решение
WITH hier(num, lvl) AS (
SELECT 0, 1
UNION ALL
SELECT 100, 1
UNION ALL
SELECT num + 1, lvl + 1
FROM hier
WHERE lvl < 100
)
SELECT DATEADD(dw, -DATEPART(dw, '29.05.2007'), '29.05.2007') + num * 7,
DATEADD(dw, -DATEPART(dw, '29.05.2007'), '29.05.2007') + (num + 1) * 7
FROM hier
WHERE DATEADD(dw, -DATEPART(dw, '29.05.2007'), '29.05.2007') + num * 7 < '29.05.2009'
ORDER BY
num
Это создаст набор строк с нужными вам диапазонами.
Другие советы
Вам необходимо убедиться, что @@DATEFIRST отправлен правильно, тогда вы можете просто использовать код ниже.Прочтите DATEFIRST, чтобы полностью понять это.
SET DATEFIRST 1
DECLARE @my_date DATETIME
SET @my_date = '2007-05-29'
SELECT
DATEADD(dw, -DATEPART(dw, @my_date), @my_date) AS StartDate,
DATEADD(dw, 6 - DATEPART(dw, @my_date), @my_date) AS EndDate
Должно быть довольно просто в вашем операторе SQL...У меня долгая история работы с датами и арифметикой дат, поэтому я бы подошёл к чему-то вроде:
select
datepart( year, YourDateField ) as GroupYear,
datepart( week, ( YourDateField - datepart( day, YourDateField ) +1 ) as GroupWeek,
YourDateField,
OtherFields
from
YourTable
where
whateverDateRange...
group by
GroupYear,
GroupWeek
Причина выбора года и недели в том, что если вы охватываете несколько лет, у вас будет неделя 1 обоих лет перед неделей 2 первого года и т. д.
Теперь, как работает математика...для GroupWeek.Это фактически вычислит первый день недели на основе любой даты, которую ваши данные берут за основу...Допустим, у вас есть данные за 25, 26, 27 мая этого года...Это будут соответственно 2-й, 3-й и 4-й дни недели, поскольку воскресенье начинает неделю с 1-го дня.Так:
25 мая – 2 (день недели) = 23 мая (суббота) +1 = 24 мая (воскресенье недели).26 - 3 мая (день недели) = 23 мая...и т. д. 27 - 4 мая (день недели) = 23 мая
Таким образом, включив также исходное поле даты, вы также можете увидеть реальную дату в одном вызове SQL...