CTE:每 15 天循环一次数据输入| SQL, SQL 服务器

CTE : looping data input every 15 days| SQL, SQL SERVER

我从这里的指南中获得了这个测试代码,我为测试练习修改了它。 我在这段代码中试图实现的是它根据某个数字循环输入,并且它将以 15 天的间隔循环。

场景:我将循环设置为5次。循环的开始日期是 08/15/2019

所以,应该输入的数据是08/15/2019, 08/30/2019, 09/15/2019, 09/30/2019, 10/15/2019(假设所有日期都在30 天。)

DECLARE @MYTESTTABLE TABLE ([Month] date, [Data 1] INT, [Data 2] INT, [Data 3] INT);
WITH MYLOOP AS (
    SELECT CAST('2019-01-01' AS DATE) AS [date], 100 as [Data 3]
    UNION ALL
    SELECT DATEADD(MONTH, 1, [date]), [Data 3]=[Data 3]+1
    FROM MYLOOP
    WHERE DATEADD(MONTH, 1, [date]) <  CAST('2022-01-01' AS DATE) )
INSERT INTO @MYTESTTABLE ([Month], [Data 1], [Data 2], [Data 3])
SELECT LEFT([date],10) as [Month], 100 AS [Data 1], 100 AS [Data 2], [Data 3]
FROM MYLOOP
SELECT * FROM @MYTESTTABLE

这是我根据那个场景得到的指南。 我现在的问题是我很难将 2 SQL 查询执行到 1.

DECLARE @YourTable table (YourDate int, valuex int,tests int)
insert into @YourTable VALUES ('100',5,11)
;WITH AllNumbers AS
(SELECT 1 AS Number, 100 AS [value]
UNION ALL
SELECT Number+1, [value]=[value]+1
FROM AllNumbers
WHERE Number<=15-1 )
SELECT 
YourDate, valuex, tests
FROM @YourTable        y
INNER JOIN AllNumbers  a ON 1=1

这是我目前得到的。

DECLARE @MYTESTTABLE TABLE ([Month] date, [Data 1] INT, [Data 2] INT, [Data 3] INT);
WITH MYLOOP AS (
    SELECT CAST('2019-01-01' AS DATE) AS [date], 1 as [Data 2], 100 as [Data 3]
    UNION ALL
    SELECT DATEADD(MONTH, 1, [date]), [Data 2]+1, [Data 3]=[Data 3]+1
    FROM MYLOOP
    WHERE  [Data 2] < 7 )
INSERT INTO @MYTESTTABLE ([Month], [Data 1], [Data 2], [Data 3])
SELECT LEFT([date],10) as [Month], 100 AS [Data 1], [Data 2], [Data 3]
FROM MYLOOP
SELECT * FROM @MYTESTTABLE

How do is set to to trigger, or add every 15 days, and not every 1 month(30 days)?

我可以就此问题请求您的帮助吗?

如果您仅从输入日期开始查找 5 个日期,则以下脚本将起作用-

Input date must need to be 15 or 30 of a month

DECLARE @st_dt DATE = '08/15/2019'
DECLARE @prev_dt DATE
DECLARE @LC INT =0
DECLARE @MYTESTTABLE TABLE ([Month] date)

WHILE @LC < 5
BEGIN

    IF @LC = 0
    BEGIN
        INSERT INTO @MYTESTTABLE ([Month]) VALUES(@st_dt)
        SET @prev_dt = @st_dt
    END

    ELSE
    BEGIN   
        IF DATEPART(DD,@prev_dt) = 15
        BEGIN
            INSERT INTO @MYTESTTABLE ([Month]) VALUES(DATEADD(DD,(CASE WHEN DATEPART(MM,@prev_dt) = 2 THEN 13 ELSE 15 END) ,@prev_dt))

            SET @prev_dt = DATEADD(DD,(CASE WHEN DATEPART(MM,@prev_dt) = 2 THEN 13 ELSE 15 END) ,@prev_dt)
        END

        ELSE
        BEGIN
            INSERT INTO @MYTESTTABLE ([Month]) 
            VALUES(DATEADD(DD,(15-DATEPART(DD,DATEADD(MM,1,@prev_dt))),DATEADD(MM,1,@prev_dt)))

            SET @prev_dt = DATEADD(DD,(15-DATEPART(DD,DATEADD(MM,1,@prev_dt))),DATEADD(MM,1,@prev_dt))
        END
    END


    SET @LC = @LC + 1
END

SELECT * FROM @MYTESTTABLE

输出是-

Month
2019-08-15
2019-08-30
2019-09-15
2019-09-30
2019-10-15

现在,如果仅将前一个日期加上 +15 天就可以满足您的要求,这很容易,下面的脚本将适用于您-

DECLARE @st_dt DATE = '8/01/2019'
DECLARE @prev_dt DATE
DECLARE @LC INT =0
DECLARE @MYTESTTABLE TABLE ([Month] date)

WHILE @LC < 5
BEGIN

    IF @LC = 0
    BEGIN
        INSERT INTO @MYTESTTABLE ([Month]) VALUES(@st_dt)
        SET @prev_dt = @st_dt
    END

    ELSE
    BEGIN   
        INSERT INTO @MYTESTTABLE ([Month]) VALUES(DATEADD(DD,15,@prev_dt))
        SET @prev_dt = DATEADD(DD,15,@prev_dt)
    END


    SET @LC = @LC + 1
END

SELECT * FROM @MYTESTTABLE

这是 CTE 版本

-- straight 15 days addition

declare @startdate date = '2019-08-15'
declare @loop smallint = 15

;with cte_count as (
 select 0 ctr
 union all
 select ctr + 1 from cte_count
 where ctr < @loop-1
)
select dateadd(day,ctr*15,x.newdate) [Date] from cte_count
cross join
 (select @startdate newdate) x

--- 下面显示第 15 天和月末

declare @startdate date = '2019-08-15'
declare @loop smallint = 50

;with cte_count as (
 select 0 ctr
 union all
 select ctr + 1 from cte_count
 where ctr < @loop-1
)
select 
distinct 
cast(iif(day(dateadd(day,ctr*15,newdate))<=15,
 dateadd(day,14,DATEADD(m, DATEDIFF(m, 0, eomonth(dateadd(day,ctr*15,newdate))), 0))
,eomonth(dateadd(day,ctr*15,newdate))) as date)
from cte_count
cross join
 (select @startdate newdate) x