Повторите строку между с и до диапазона дат - PullRequest
0 голосов
/ 24 марта 2019

Привет, у меня выходит таблица со столбцом «С» и «По», без примененных дней. Я хочу повторить строку между «С» и «По».

Фактический результат

leaveid fromdate    Todate       noofdays
1       01/01/2019  02/01/2019      2

Исключенный результат

  leveid  fromdate      Todate      
     1     01/01/2019   01/01/2019 
      2    02/01/2019    02/01/2019

1 Ответ

1 голос
/ 24 марта 2019

Вы можете использовать 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 |
+---------+------------+------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...