如何在这样的循环中增加WHILE LOOP
中的日期:
DECLARE @StartDate Datetime = some_date;
DECLARE @EndDate Datetime = other_date;
DECLARE @FinishDate Datetime = last_date;
WHILE @EndDate < @FinishDate
BEGIN
[something happens]
SET @StartDate = [ plus 1 day to @EndDate ]
SET @EndDate = [ plus 8 days to itself]
END
我可以在表达式<
中使用运算符@EndDate < @FinishDate
吗?
顺便说一句,我试过使用DATEADD
,但它不起作用。如果我设置数据类型DATETIME2
,则返回ERROR 8117
。
答案 0 :(得分:3)
我认为如果你使用SQLServer
它必须有效SET @StartDate = DATEADD(DAY,1,@EndDate)
SET @EndDate = DATEADD(DAY,8,@EndDate)
测试
DECLARE @StartDate Datetime = '20171201';
DECLARE @EndDate Datetime = '20171205';
DECLARE @FinishDate Datetime = '20171231';
WHILE @EndDate < @FinishDate
BEGIN
SET @StartDate = DATEADD(DAY,1,@EndDate)
SET @EndDate = DATEADD(DAY,8,@EndDate)
PRINT CONVERT(varchar(10),@StartDate,120)+' - '+CONVERT(varchar(10),@EndDate,120)
END
答案 1 :(得分:0)
根据OP上面提到的评论,他们正在寻找几个星期到结束日期。使用rCTE可以更容易(并且有效)地实现循环,而不是使用循环来实现这一点:
DECLARE @FinishDate datetime = '20171231', @StartDate datetime = '20171204';
DECLARE @EndDate datetime = DATEADD(DAY, 6, @StartDate);
WITH Dates AS (
SELECT @StartDate AS StartDate,
@EndDate AS EndDate
UNION ALL
SELECT DATEADD(DAY, 7,StartDate),
DATEADD(DAY, 7,EndDate)
FROM Dates
WHERE DATEADD(DAY, 7,EndDate) <= @FinishDate)
SELECT *
FROM Dates;
这将为您提供2017年12月的所有周。