Use below query to get the result
DECLARE @Temp TABLE
(
ID INT
,Value NUMERIC(10,2)
,StartDate DATE
,EndDate DATE
)
DECLARE @NewTable TABLE
(
id INT IDENTITY(1,1)
,item INT
,Value NUMERIC(10,2)
,StartDate DATE
,EndDate DATE
)
INSERT INTO @Temp
SELECT 123,5000 ,'2017-04-14','2018-12-15'
DECLARE @SDate date
DECLARE @EDate date
declare @LastDay INT =0
SELECT top 1 @SDate=StartDate,@EDate=EndDate FROM @Temp
declare @Year int = 0
declare @Month int = 0
declare @Index INT =1
DECLARE @Lenght int =DATEDIFF(MONTH,@SDate,@EDate) +1
WHILE @Index<=@Lenght
BEGIN
IF @Index=1 BEGIN
-- first record
SELECT @Year= YEAR(@SDate)
SELECT @Month = MONTH(@SDate)
-- get last day of the date
SELECT @LastDay = day(DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@SDate)+1,0)))
SELECT @EDate= CONVERT(VARCHAR(10),@Year)+'-'+CONVERT(VARCHAR(10),@Month)+'-
'+CONVERT(VARCHAR(10),@LastDay)
INSERT INTO @NewTable
SELECT 123,5000,@SDate, @EDate
END ELSE IF @Index = @Lenght BEGIN
SELECT @Month = @Month+1
IF @Month>12 BEGIN
SELECT @Month =1
SELECT @Year =@Year +1
END ELSE BEGIN
SELECT @Year= YEAR(@EDate)
END
SELECT @SDate =CONVERT(VARCHAR(10),@Year)+'-'+CONVERT(VARCHAR(10),@Month)+ '-01'
INSERT INTO @NewTable
SELECT 123,5000 ,@SDate,@EDate
END ELSE BEGIN
SELECT @Month = @Month+1
if @Month>12 BEGIN
SELECT @Month =1
SELECT @Year =@Year +1
END
SELECT @SDate =CONVERT(VARCHAR(10),@Year)+'-'+CONVERT(VARCHAR(10),@Month)+ '-01'
SELECT @LastDay = day(DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@SDate)+1,0)))
SELECT @EDate= CONVERT(VARCHAR(10),@Year)+'-'+CONVERT(VARCHAR(10),@Month)+'-'+CONVERT(VARCHAR(10),@LastDay)
INSERT INTO @NewTable
SELECT 123,5000 ,@SDate,@EDate
END
SELECT @Index=@Index+1
结尾
从@NewTable 中选择 *
--选择日期(DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,getdate())+1,0)))