Группировка дат по неделям - PullRequest
4 голосов
/ 27 мая 2009

У меня есть диапазон дат, где дата начала - 2 года до сегодняшнего дня. например, '05 / 29/2007 '~ '05 / 29/2009' .

Как мне выйти за пределы диапазона дат, чтобы получить список, подобный следующему?

(дата начала начинается с «27.05.2007», а не «29.05.2007», поскольку начало дня недели - воскресенье, а «05/27/2007» - первый день недели для 05.05. / 2007 'и те же рассуждения для последней Конечной даты, 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

Ответы [ 3 ]

4 голосов
/ 27 мая 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  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

Будет создан набор строк с нужными диапазонами.

2 голосов
/ 27 мая 2009

Вы должны убедиться, что @@ 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
0 голосов
/ 27 мая 2009

Должно быть довольно просто, прямо в вашем выражении 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-й день недели - воскресенье начинает неделю с первого дня. Итак:

25 - 2 мая (день недели) = 23 мая (суббота) +1 = 24 мая (воскресенье недели). 26 - 3 мая (день недели) = 23 мая ... и т. Д. 27 - 4 мая (день недели) = 23 мая

Таким образом, если вы включите оригинальное поле даты, вы также сможете увидеть реальную дату в одном вызове SQL ...

...