Member 11322120 Ответов: 1

Получение дневной записи с использованием данных оставьте дату начала между датой окончания


My Table Record

Employee Id	Start Date	EndDate	Text
1	2019-09-01	2019-09-03	Demo1 Text
2	2019-09-04	2019-09-04	Demo2 Text
3	2019-09-05	2019-09-08	Demo3 Text


#Результат
Employee Id	Date	Text
1	2019-09-01	Demo1 Text
1	2019-09-02	Demo1 Text
1	2019-09-03	Demo1 Text
2	2019-09-04	Demo2 Text
3	2019-09-05	Demo3 Text
3	2019-09-06	Demo3 Text
3	2019-09-07	Demo3 Text
3	2019-09-08	Demo3 Text


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

CREATE TABLE #EmployeeAttandance
(
	Employee_Id int,
	StartDate datetime,
	EndDate datetime,
	Text VARCHAR (50)
)

Insert Into #EmployeeAttandance Values(1,'2019-09-01', '2019-09-03','Demo1 Text')
Insert Into #EmployeeAttandance Values(2, '2019-09-04', '2019-09-04', 'Demo2 Text')
Insert Into #EmployeeAttandance Values(3, '2019-09-05', '2019-09-08', 'Demo3 Text')

select * from #EmployeeAttandance

drop table #EmployeeAttandance

Maciej Los

У вас есть какие-нибудь вопросы?

1 Ответов

Рейтинг:
11

Maciej Los

Я бы предложил использовать КТОС[^]. Видеть:

DECLARE @tmp TABLE(Employee_Id int, StartDate datetime, EndDate datetime, [Text] VARCHAR (50)) 

INSERT INTO @tmp(Employee_Id, StartDate, EndDate, [Text])
VALUES(1, '2019-09-01', '2019-09-03', 'Demo1 Text'),
(2, '2019-09-04', '2019-09-04', 'Demo2 Text'),
(3, '2019-09-05', '2019-09-08', 'Demo3 Text')

;WITH CTE AS
(
	--initial part
	SELECT Employee_Id, 1 AS DayNo, StartDate, EndDate, [Text]
	FROM @tmp
	--recursive part
	UNION ALL
	SELECT Employee_Id, DayNo + 1 AS DayNo, DATEADD(DD, 1, StartDate) AS StartDate, EndDate, [Text]
	FROM CTE
	WHERE DATEADD(DD, 1, StartDate)<=EndDate
)
SELECT *
FROM CTE
ORDER BY Employee_Id, DayNo 


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