0

我在 SQL (2012) 表中连续有如下数据

ID Value StartDate EndDate 123 5000 14/04/2017 15/12/2017

我想将该行拆分为每个单独的月份,如下所示:

ID Value StartDate EndDate 123 5000 14/04/2017 30/04/2017 123 5000 01/05/2017 31/05/2017 123 5000 01/06/2017 30/06/2017 123 5000 01/07/2017 31/07/2017 123 5000 01/08/2017 30/08/2017 123 5000 01/09/2017 31/09/2017 123 5000 01/10/2017 31/10/2017 123 5000 01/11/2017 30/11/2017 123 5000 01/12/2017 15/12/2017

感谢在这件事上的帮助。

4

2 回答 2

0

你可以这样做:

WITH tally
AS (SELECT TOP (1000)
           ROW_NUMBER() OVER (ORDER BY t1.object_id) AS N
    FROM master.sys.all_columns t1
        CROSS JOIN master.sys.all_columns t2),
     rowset
AS (SELECT ID,
           Value,
           DATEADD(m, N - 1, StartDate) AS StartDate,
           Enddate,
           N
    FROM tally, MyDates
    WHERE DATEFROMPARTS(YEAR(DATEADD(m, N - 1, StartDate)), 
    MONTH(DATEADD(m, N - 1, StartDate)), 1) <= EndDate) 
SELECT Id,
       Value,
       CASE
           WHEN N = 1 THEN
               StartDate
           ELSE
               DATEFROMPARTS(YEAR(StartDate), MONTH(StartDate), 1)
       END AS StartDate,
       CASE
           WHEN DATEADD(d, -DAY(DATEADD(m, 1, StartDate)), DATEADD(m, 1, StartDate)) <= EndDate THEN
               DATEADD(d, -DAY(DATEADD(m, 1, StartDate)), DATEADD(m, 1, StartDate))
           ELSE
               Enddate
       END AS EndDate
FROM rowset
ORDER BY ID, StartDate;
于 2018-07-04T15:43:22.830 回答
-1
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)))

于 2018-07-04T16:59:04.067 回答