如何增加日期并将其与“>”等运算符一起使用或'<'在SQL服务器?

时间:2017-12-07 08:25:31

标签: sql sql-server

如何在这样的循环中增加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

2 个答案:

答案 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月的所有周。