Вы можете использовать master..[spt_values]
, чтобы сгенерировать нужное количество строк, и использовать Dateadd
, чтобы сгенерировать даты, подобные следующим.
;with cte
as (select number
from master..[spt_values]
where type = 'p')
select number+1 as leaveid,
Dateadd(day, number, fromdate) fromdate,
Dateadd(day, number, fromdate) todays
from @table t
inner join cte c
on c.number < t.noofdays
Демонстрация онлайн
Если вы не хотите использовать master..[spt_values]
, вы также можете использовать рекурсивный CTE
, как показано ниже.
declare @maxNoOfDay int = (select max(noofdays) from @table)
;with seq( number ) as
(
Select 0 as number
union all
Select number + 1
from seq
where number <= @maxNoOfDay
)
select number+1 as leaveid,
Dateadd(day, number, fromdate) fromdate,
Dateadd(day, number, fromdate) todays
from @table t
inner join seq c
on c.number < t.noofdays
выход
+---------+-------------------------+-------------------------+
| leaveid | fromdate | todays |
+---------+-------------------------+-------------------------+
| 1 | 2019-01-01 00:00:00.000 | 2019-01-01 00:00:00.000 |
+---------+-------------------------+-------------------------+
| 2 | 2019-01-02 00:00:00.000 | 2019-01-02 00:00:00.000 |
+---------+-------------------------+-------------------------+
EDIT:
Если вам нужны даты в определенном формате, вы можете использовать CONVERT
, как показано ниже.
declare @maxNoOfDay int = (select max(noofdays) from @table)
;with seq( number ) as
(
Select 0 as number
union all
Select number + 1
from seq
where number <= @maxNoOfDay
)
select number+1 as leaveid,
convert(varchar, Dateadd(day, number, fromdate), 103) fromdate,
convert(varchar, Dateadd(day, number, fromdate), 103) todays
from @table t
inner join seq c
on c.number < t.noofdays
Онлайн-демонстрация
выход
+---------+------------+------------+
| leaveid | fromdate | todays |
+---------+------------+------------+
| 1 | 01/01/2019 | 01/01/2019 |
+---------+------------+------------+
| 2 | 02/01/2019 | 02/01/2019 |
+---------+------------+------------+