Ваш вопрос не очень ясен, но мой магический шарик-кристалл говорит мне, что вы, возможно, ищете это:
SET DATEFORMAT ymd;
CREATE TABLE #InputTABLE
(
TaskID varchar (200),
startdate DATETIME,
enddate DATETIME,
TaskWork int
);
INSERT INTO #InputTABLE VALUES('six days','2018-06-06','2018-06-12',200)
,('one day','2018-06-06','2018-06-07',200);
SELECT TaskID
,DATEADD(DAY,B.Numbr,startdate) AS ExplodingDate
,CAST(TaskWork AS DECIMAL(10,4))/A.DayDiff
FROM #InputTABLE
CROSS APPLY(SELECT DATEDIFF(DAY,startdate,enddate) AS DayDiff) A
CROSS APPLY(SELECT TOP (A.DayDiff) ROW_NUMBER() OVER(ORDER BY (SELECT NULL))-1 AS Numbr FROM master..spt_values) B
DROP TABLE #InputTABLE;
результат
TaskID ExplodingDate (Kein Spaltenname)
six days 2018-06-06 00:00:00.000 33.333333333333333
six days 2018-06-07 00:00:00.000 33.333333333333333
six days 2018-06-08 00:00:00.000 33.333333333333333
six days 2018-06-09 00:00:00.000 33.333333333333333
six days 2018-06-10 00:00:00.000 33.333333333333333
six days 2018-06-11 00:00:00.000 33.333333333333333
one day 2018-06-06 00:00:00.000 200.000000000000000
Краткое объяснение
Первая APPLY
вычисляет разницу в днях между двумя датами.
Вторая APPLY
использует трюк с TOP
и ROW_NUMBER
для создания таблицы подсчета на лету.
Это создаст столько строк на входную строку, сколько будет дней между начальной и конечной датой.
Остальное - простое вычисление ...
ОБНОВЛЕНИЕ Полный пример с постоянной таблицей
CREATE DATABASE TestDB;
GO
USE TestDB;
GO
CREATE TABLE dbo.RunningNumbers(Number INT NOT NULL
,CalendarDate DATE NOT NULL
,CalendarYear INT NOT NULL
,CalendarMonth INT NOT NULL
,CalendarDay INT NOT NULL
,CalendarWeek INT NOT NULL
,CalendarYearDay INT NOT NULL
,CalendarWeekDay INT NOT NULL);
DECLARE @CountEntries INT = 100000;
DECLARE @StartNumber INT = 0;
WITH E1(N) AS(SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N)), --10 ^ 1
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows
E8(N) AS(SELECT 1 FROM E4 a CROSS JOIN E4 b), -- 10 ^ 8 = 10,000,000 rows
CteTally AS
(
SELECT TOP(ISNULL(@CountEntries,1000000)) ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) -1 + ISNULL(@StartNumber,0) As Nmbr
FROM E8
)
INSERT INTO dbo.RunningNumbers
SELECT CteTally.Nmbr,CalendarDate.d,CalendarExt.*
FROM CteTally
CROSS APPLY
(
SELECT DATEADD(DAY,CteTally.Nmbr,{ts'1900-01-01 00:00:00'})
) AS CalendarDate(d)
CROSS APPLY
(
SELECT YEAR(CalendarDate.d) AS CalendarYear
,MONTH(CalendarDate.d) AS CalendarMonth
,DAY(CalendarDate.d) AS CalendarDay
,DATEPART(WEEK,CalendarDate.d) AS CalendarWeek
,DATEPART(DAYOFYEAR,CalendarDate.d) AS CalendarYearDay
,DATEPART(WEEKDAY,CalendarDate.d) AS CalendarWeekDay
) AS CalendarExt;
GO
SET DATEFORMAT ymd;
CREATE TABLE #InputTABLE
(
TaskID varchar (200),
startdate DATETIME,
enddate DATETIME,
TaskWork int
);
INSERT INTO #InputTABLE VALUES('six days','2018-06-06','2018-06-12',200)
,('one day','2018-06-06','2018-06-07',200);
SELECT TaskID
,B.CalendarDate
,CAST(TaskWork AS DECIMAL(10,4))/(A.DayDiff+1)
FROM #InputTABLE
CROSS APPLY(SELECT DATEDIFF(DAY,startdate,enddate) AS DayDiff) A
CROSS APPLY(SELECT * FROM dbo.RunningNumbers WHERE CalendarDate BETWEEN startdate AND enddate) B
DROP TABLE #InputTABLE;
GO
USE master;
GO
DROP DATABASE TestDB;