问题
I have a very simple query that takes two dates (start and end date, ex: 01/01/2018-01/31/2018) and then take out the week number of start and end date (ex: 1 and 5). I use while loop in order to enter all week numbers in one table (ex: 1,2,3,4,5). My while loop is creating duplicate records, like multiple records for all values. I am not sure what the issue is. Can someone suggest what I am might be doing wrong?
Code:
DECLARE @StartDate datetime = '01/01/2018'
,@EndDate datetime = '01/31/2018'
DECLARE @StartDateWeek INT = DATEPART(WK,@StartDate)
,@EndDateWeek INT = DATEPART(WK,@EndDate)
SELECT @StartDateWeek,@EndDateWeek
DECLARE @DateRangeWeekList TABLE(
Date DATE
,WeekNumber INT)
INSERT INTO @DateRangeWeekList
SELECT Date = @StartDate
,WeekNumber = @StartDateWeek
select * from @DateRangeWeekList
WHILE (SELECT MAX(WeekNumber) FROM @DateRangeWeekList) < (SELECT @EndDateWeek)
BEGIN
INSERT INTO @DateRangeWeekList
SELECT Date = null
,WeekNumber = WeekNumber +1
FROM @DateRangeWeekList
END
select * from @DateRangeWeekList
Result:
Date WeekNumber
2018-01-01 1
NULL 2
NULL 2
NULL 3
NULL 2
NULL 3
NULL 3
NULL 4
NULL 2 and more (total 18 records)
Expected Result
Date WeekNumber
2018-01-01 1
NULL 2
NULL 3
NULL 4
NULL 5
回答1:
A recursive CTE would be far better here than a WHILE
loop:
DECLARE @StartDate datetime = '01/01/2018',
@EndDate datetime = '01/31/2018';
WITH WeekNumbers AS(
SELECT CONVERT(date,@StartDate) AS [Date],
1 AS WeekNumber
UNION ALL
SELECT NULL,
WeekNumber + 1
FROM WeekNumbers
WHERE WeekNumber <= DATEDIFF(WEEK, @StartDate, @EndDate))
SELECT *
FROM WeekNumbers;
You could also, however, consider using a Calendar table. There are lots of options out there for you.
回答2:
Perhaps you can try this format for inserting your values.
INSERT INTO @DateRangeWeekList (Date, WeekNumber)
VALUES (null, WeekNumber +1)
来源:https://stackoverflow.com/questions/48710724/while-loop-creating-duplicate-records