Вопрос

У меня есть диапазон дат, в котором дата начала на 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...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top