Member 14112539 Ответов: 1

Как разделить одну строку SQL на несколько строк на основе begdate и enddate?


Таблица Т1
ID	BegDate	EndDate
1	01-01-2020	01-07-2021
2	01-01-2020	01-02-2021
3	01-01-2020	01-12-2021


I need to split table t1 records into month wise in SQL Server 12 Below is the example for ID=1


ID	OLD_ID	BegDate	EndDate
1	1	01-01-2020	31-01-2020
2	1	01-02-2020	29-02-2020
3	1	01-03-2020	31-03-2020
4	1	01-04-2020	30-04-2020
5	1	01-05-2020	31-05-2020
6	1	01-06-2020	30-06-2020
7	1	01-07-2020	31-07-2020
8	1	01-08-2020	31-08-2020
9	1	01-09-2020	30-09-2020
10	1	01-10-2020	31-10-2020
11	1	01-11-2020	30-11-2020
12	1	01-12-2020	31-12-2020
13	1	01-01-2021	31-01-2021
14	1	01-02-2021	20-02-2021
15	1	01-03-2021	31-03-2021
16	1	01-04-2021	30-04-2021
17	1	01-05-2021	31-05-2021
18	1	01-06-2021	30-06-2021


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

Я использовал курсор, но не смог получить требуемый результат

Patrice T

И вы планируете показать свой код ?

1 Ответов

Рейтинг:
2

Maciej Los

Вы можете использовать CTE:

SET DATEFORMAT dmy;

DECLARE @dateranges TABLE(ID INT, BegDate DATE, EndDate DATE)

INSERT INTO @dateranges(ID, BegDate, EndDate)
VALUES(1, '01-01-2020',	'01-07-2021'),
(2,	'01-01-2020',	'01-02-2021'),
(3, '01-01-2020',	'01-12-2021')

;WITH CTE AS
(
	--initial part
	SELECT ID, BegDate AS StartOfMonth, DATEADD(DD, -1, DATEADD(MM, 1, BegDate)) AS EndOfMonth, EndDate
	FROM @dateranges
	-- recursive part
	UNION ALL
	SELECT ID, DATEADD(MM, 1, StartOfMonth) AS StartOfMonth, DATEADD(DD, -1, DATEADD(MM, 2, StartOfMonth)) AS EndOfMonth, EndDate
	FROM CTE 
	WHERE DATEADD(MM, 1, StartOfMonth)< EndDate
)
SELECT ID, StartOfMonth, EndOfMonth
FROM CTE
WHERE ID = 1


Для получения более подробной информации, пожалуйста, смотрите:
With обобщенное_табличное_выражение (Transact-SQL) при SQL-сервера Майкрософт документы[^]
Обобщенные табличные выражения (введение в КТР-х) - необходимые для SQL[^]
Освоение общего табличного выражения или CTE в SQL Server[^]