Как разделить месяцы между начальной и конечной датами из таблицы в SQL - PullRequest
0 голосов
/ 24 июня 2019

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

Ниже приведен формат таблицы, с которой я хочу работатьс:

Table 1 (Input Table)
+------------+------------+------------+
| Start Date |  End Date  |  Currency  |
+------------+------------+------------+
| 01/01/2016 | 30/05/2016 |   EUR      | 
| 01/03/2017 | 31/05/2017 |   BDT      | 
+------------+------------+------------+

Из приведенной выше таблицы я хочу, чтобы хранимая процедура выдавала вывод, подобный следующему:

Table 2 (Desired result from sql script)
Date        Currency
---------------------
01/01/2016  EUR
01/02/2016  EUR
01/03/2016  EUR
01/04/2016  EUR
01/05/2016  EUR
01/03/2017  BDT
01/04/2017  BDT
01/05/2017  BDT

Затем я хочу объединить эти два вывода, чтобы получить окончательную таблицукак это:

Final Table (Join on Table 1 and 2) 

Start Date  End Date    Split Date  Currency    Exchange Rate
-------------------------------------------------------------
01/01/2016  30/05/2016  18/01/2016  EUR         x
01/01/2016  30/05/2016  18/02/2016  EUR         z
01/01/2016  30/05/2016  18/03/2016  EUR         h
01/01/2016  30/05/2016  18/04/2016  EUR         g
01/01/2016  30/05/2016  18/05/2016  EUR         a
01/03/2017  31/05/2018  01/03/2017  BDT         b
01/03/2017  31/05/2018  01/04/2017  BDT         c
01/03/2017  31/05/2018  01/05/2017  BDT         f

Я нашел несколько решений по стеку, как это:

declare @StartDate date = '20170401'
      , @EndDate   date = '20170731';

;with Months as 
(
    select top (datediff(month, @startdate, @enddate) + 1) 
        [Month] = dateadd(month, row_number() over (order by number) -1, @StartDate),
        MonthEnd = dateadd(day,-1,dateadd(month, row_number() over (order by number), @StartDate))   
    from 
        master.dbo.spt_values   
    order by 
        [Month] 
) 
select * from Months;

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

1 Ответ

0 голосов
/ 24 июня 2019

Я думаю, у меня есть представление о том, что вы пытаетесь сделать.Все это будет выполнено одним запросом.

Сначала настройте тестовые данные (исправив опечатку, где enddate был

create table xchg(startdate date, enddate date, currency varchar(3))
insert xchg values ('2016-01-18','2016-05-30','EUR')
,('2017-03-19','2017-05-31','BDT')

Затем рекурсивный запрос выбирает каждую годовщину междудве даты.Не знаю, откуда вы получаете обменный курс, но вы сможете добавить его к этому.

;with splits as
(
    select *, startdate as split from xchg
    union all
    select startdate, enddate, currency, 
        dateadd(m,1,split) 
    from splits
    where dateadd(m,1,split) <= enddate
)
select * from splits order by currency, split

Результат:

startdate   enddate     currency    split
2017-03-19  2017-05-31  BDT         2017-03-19
2017-03-19  2017-05-31  BDT         2017-04-19
2017-03-19  2017-05-31  BDT         2017-05-19
2016-01-18  2016-05-30  EUR         2016-01-18
2016-01-18  2016-05-30  EUR         2016-02-18
2016-01-18  2016-05-30  EUR         2016-03-18
2016-01-18  2016-05-30  EUR         2016-04-18
2016-01-18  2016-05-30  EUR         2016-05-18
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...