尝试一下:
DECLARE @DataSource TABLE
(
[Code] INT,[Date] DATE,[value] INT
);
INSERT INTO @DataSource ([Code],[Date],[value])
VALUES (1000,'2016-08-05',5000),(1000,'2016-12-27',8000),'2018-03-19',6000),'2018-06-02',6000);
WITH Ranges AS
(
SELECT *,LEAD([Date]) OVER (ORDER BY [Date] ASC) AS [DateEnd]
FROM @DataSource DS
)
SELECT *
FROM Ranges
CROSS APPLY
(
SELECT DATEADD(MONTH,[number],[Date])
FROM
(
select number
from master.dbo.spt_values
where [type] = 'P'
) numbers
WHERE DATEADD(MONTH,[Date]) < [DateEnd]
) AutoDates ([GeneratedDate]);
这个想法很简单-使用LEAD
获取日期范围的上限。然后有了开始和结束日期,只需使用DATEADD
函数生成缺少的月份即可。
,
一种解决方案是在递归CTE中创建数字表,然后与该表连接。您可以使用not exists
连接条件来定义每个系列的边界:据我了解,您每个月只需要一个日期(在同一个月中没有间隔和重叠),因此我将eomonth()
用于那个。
查询:
with nums(i) as (
select 0
union all select i + 1 from nums where i < 24
)
select
t.code,dateadd(month,i,t.date) date,t.value
from mytable t
inner join nums n
on not exists (
select 1
from mytable t1
where t1.date > t.date and eomonth(t1.date) < eomonth(dateadd(month,i + 1,t.date))
)
order by date
您可以将cte中的上限扩展到连续的最大月份数(我将其设置为24)。
Demo on DB Fiddle :
code | date | value
---: | :------------------ | ----:
1000 | 05/08/2016 00:00:00 | 5000
1000 | 05/09/2016 00:00:00 | 5000
1000 | 05/10/2016 00:00:00 | 5000
1000 | 05/11/2016 00:00:00 | 5000
1000 | 27/12/2016 00:00:00 | 8000
1000 | 27/01/2017 00:00:00 | 8000
1000 | 27/02/2017 00:00:00 | 8000
1000 | 27/03/2017 00:00:00 | 8000
1000 | 27/04/2017 00:00:00 | 8000
1000 | 27/05/2017 00:00:00 | 8000
1000 | 27/06/2017 00:00:00 | 8000
1000 | 27/07/2017 00:00:00 | 8000
1000 | 27/08/2017 00:00:00 | 8000
1000 | 27/09/2017 00:00:00 | 8000
1000 | 27/10/2017 00:00:00 | 8000
1000 | 27/11/2017 00:00:00 | 8000
1000 | 27/12/2017 00:00:00 | 8000
1000 | 27/01/2018 00:00:00 | 8000
1000 | 27/02/2018 00:00:00 | 8000
1000 | 19/03/2018 00:00:00 | 6000
1000 | 19/04/2018 00:00:00 | 6000
1000 | 19/05/2018 00:00:00 | 6000
1000 | 02/06/2018 00:00:00 | 6000
1000 | 02/07/2018 00:00:00 | 6000
1000 | 02/08/2018 00:00:00 | 6000
1000 | 02/09/2018 00:00:00 | 6000
1000 | 02/10/2018 00:00:00 | 6000
1000 | 02/11/2018 00:00:00 | 6000
1000 | 02/12/2018 00:00:00 | 6000
1000 | 02/01/2019 00:00:00 | 6000
1000 | 02/02/2019 00:00:00 | 6000
1000 | 02/03/2019 00:00:00 | 6000
1000 | 02/04/2019 00:00:00 | 6000
1000 | 02/05/2019 00:00:00 | 6000
1000 | 02/06/2019 00:00:00 | 6000
1000 | 02/07/2019 00:00:00 | 6000
1000 | 02/08/2019 00:00:00 | 6000
1000 | 02/09/2019 00:00:00 | 6000
1000 | 02/10/2019 00:00:00 | 6000
1000 | 02/11/2019 00:00:00 | 6000
1000 | 02/12/2019 00:00:00 | 6000
1000 | 02/01/2020 00:00:00 | 6000
1000 | 02/02/2020 00:00:00 | 6000
1000 | 02/03/2020 00:00:00 | 6000
1000 | 02/04/2020 00:00:00 | 6000
1000 | 02/05/2020 00:00:00 | 6000
1000 | 02/06/2020 00:00:00 | 6000
本文链接:https://www.f2er.com/3161384.html