Vincent Ducroquet Ответов: 2

Как получить даты каждые n недель в SQL/T-SQL


Здравствуйте, у меня есть таблица с двумя столбцами :
Первое : событие, содержащее даты
Второе: число недели от даты

Я хотел бы сделать выбор на моем столе и получать только даты каждый вторник и каждые n недель(например, 6) с первого появления.
Ex: 
OCCURENCE     WEEK_NUMBER
07/03/2017         8        --First tuesday
14/03/2017         9        -- Second tuesday of the month
21/03/2017        10        --Third tuesday of the month
28/03/2017        11        --Fourth
   ...           ...

Таким образом , первое появление моей задачи происходит 07.03.2017 года, и я хотел бы получить каждое появление каждые 3 недели, так что получите как возврат выбора :

OCCURENCE     WEEK_NUMBER
07/03/2017         8          --First occurence
28/03/2017        11          -- Third occurence
   ...           ...

Это должно работать, если я хочу получать каждые n недель ^^

Спасибо :)

Что я уже пробовал:

Я пытался использовать модуль на week_number, но я не знаю, как получить только события за n недель

Andy Lanng

Какой язык sql? T-SQL, P-SQL, MySQL...

Vincent Ducroquet

SQL-сервер или T-SQL

2 Ответов

Рейтинг:
2

Andy Lanng

declare @weeks int
set @weeks = 3

--Common Table Expressions
;with mycte as (
	-- get the lower and upper bounds to limit the recursion
	select min([table_date]) as startPoint, max([table_date]) as endPoint, [id]
	from [table]
	group by id
), mycte2 as (
	--recursive cte gets all dates that are @weeks after the startPoint and are lessthan or equal to the endPoint
	select startPoint, endPoint, id
	from mycte
	--These are very powerful and fast
	union all select DATEADD(week,@weeks,startPoint), endPoint, id
	from mycte2
	where DATEADD(week,@weeks,startPoint) <= endPoint
)
--finally, select all the items that fit into the id, and date and date + n*m weeks
select * from [table] t
inner join mycte2 m on t.id = m.id and t.[table_date] = m.date


Здесь много чего происходит. Вот некоторые вещи, на которые стоит обратить внимание
Использование Общих Табличных Выражений[^]
Рекурсивные Запросы, Использующие Обобщенные Табличные Выражения[^]

ОБНОВЛЕНИЕ: Возгласы. "Объединение все"это правильный синтаксис


Andy Lanng

Возможно, я пропустил 3 буквы, но это было все по памяти. Блин мне нужен перерыв

Vincent Ducroquet

Ах, спасибо ! я пытаюсь использовать ваш код, но это трудно, потому что моя таблица генерируется функцией, которая содержится в DLL и генерирует только один столбец(Occurence), поэтому я пытаюсь добавить столбец id и столбец week_number^^

Andy Lanng

Покажи мне, что у тебя есть, и я, возможно, смогу помочь.

Рейтинг:
0

Peter Leow

Попробовать это:

SELECT * FROM tablename WHERE DATEDIFF(week, CONVERT(DATE,'07/03/2017',103), CONVERT(DATE,occurence,103) ) % 3 = 0
или демонстрация[^]