09.06.2019

SQL: генерация списка дат и недель

Иногда для решения задачи бывает удобно получить список недель или последовательность дат для дальнейшего объединения с другими данными из БД. Получить список дат в указанном диапазоне можно таким образом (применительно к T-SQL):
DECLARE @StartDate date = '20190101'
DECLARE @EndDate date = '20191231'

;WITH calendarDates as
( 
   SELECT dt = @StartDate

   UNION ALL

   SELECT DATEADD(DAY, 1, dt)
   FROM calendarDates
   WHERE DATEADD(DAY, 1, dt) <= @EndDate
)

SELECT *
FROM calendarDates
ORDER BY dt
OPTION (MAXRECURSION 0)

Если нужно получить список всех дат начала недели, то пригодится такой трюк:
DECLARE @StartDate date = '20190101'
DECLARE @EndDate date = '20191231'
DECLARE @WeekStartDate date =  DATEADD(DAY, 2 - DATEPART(ISO_WEEK, @StartDate), CAST(@StartDate AS DATE))
DECLARE @WeekEndDate date = DATEADD(DAY, 8 - DATEPART(ISO_WEEK, GETDATE()), CAST(GETDATE() AS DATE))

;WITH calendarDates as
( 
   SELECT dt = @WeekStartDate

   UNION ALL

   SELECT DATEADD(DAY, 7, dt)
   FROM calendarDates
   WHERE DATEADD(DAY, 7, dt) <= @EndDate
)

SELECT *
FROM calendarDates
ORDER BY dt
OPTION (MAXRECURSION 0)

Комментариев нет:

Отправить комментарий