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
我从这里的指南中获得了这个测试代码,我为测试练习修改了它。 我在这段代码中试图实现的是它根据某个数字循环输入,并且它将以 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