检查日期中是否存在日期,然后在该日期添加额外一天

时间:2014-06-26 09:56:47

标签: sql sql-server sql-server-2008 sql-server-2008-r2

我想将天数(例如3天)添加到给定日期。在添加天数之前,我们可以检查已在一个表中配置的假期。   这是我的示例代码。但我无法实现它。

declare @HolidaysList NVARCHAR(250) = '2014-06-29,2014-07-02,2014-07-18,2014-07-30,2014-10-26'
DECLARE @RDATE DATE = '2014-06-28' 
declare @addDays int = 3
declare @count int = 0

while(@count < @addDays)
    BEGIN
        set @RDATE = DATEADD(DAY,1,@RDATE)
        --print '1  ' +cast( @RDATE as nvarchar(100))
        if exists(SELECT ITEM FROM fnSplit(@HolidaysList,',') WHERE item = @RDATE)
            begin
                SELECT @RDATE= CONVERT(VARCHAR(10),DATEADD(DAY,1,@RDATE),101)
                PRINT 'if '+ CAST( @HRDATE AS NVARCHAR(100))
            end

        set @count = @count+1

    END
PRINT @RDATE

此处 fnSplit 是一个返回表格的函数。 在上面的脚本中,我必须在 @RDate 中添加3天。在添加之前,我必须检查假期列表,即 @HolidaysList 。如果假期到来,我们可以添加额外的日期。

在上面的脚本中输出为: 2014-08-03 因为29日是假日,2日也是假日。所以输出将是2014-08-03

2 个答案:

答案 0 :(得分:0)

你可以不用循环来做到这一点:

DECLARE @Holidays TABLE (Item DATE);
INSERT @Holidays 
VALUES ('2014-06-29'),('2014-07-02'),('2014-07-18'),('2014-07-30'),('2014-10-26');

DECLARE @RDATE DATE = '2014-06-28',
        @addDays INT = 3;

WITH CTE AS
(   SELECT  *,
            RowNumber = ROW_NUMBER() OVER(ORDER BY d.Date)
    FROM    (   SELECT  DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY object_id), @RDATE)
                FROM    sys.all_objects
            ) AS d (Date)
    WHERE   NOT EXISTS
            (   SELECT  1
                FROM    @Holidays AS h
                WHERE   h.Item = d.Date
            )
)
SELECT  Date
FROM    CTE
WHERE   RowNumber = @addDays;

校长是这部分:

SELECT  Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY object_id), @RDATE)
FROM    sys.all_objects 

只会从您的开始日期生成一个日期列表。然后,您使用NOT EXISTS从此列表中排除所有假期,并使用ROW_NUMBER()在所有这些日期添加排名。然后只是选择具有所需等级的日期。

答案 1 :(得分:0)

declare @HolidaysList NVARCHAR(250) = '2014-06-29,2014-06-30,2014-07-01,2014-07-30,2014-07-18,2014-10-26'
DECLARE @RDATE DATE = '2014-06-28'
declare @addDays int = 3
declare @count int = 0
DECLARE @EXISTS int = 0

while(@count < @addDays)
    BEGIN
        set @RDATE = DATEADD(DAY,1,@RDATE)
        if exists(SELECT ITEM FROM fnSplit(@HolidaysList,',') WHERE item = @RDATE)
             set @EXISTS = @EXISTS+1             
        set @count = @count+1       
    END
if(@EXISTS is not null)
    set @RDATE = DATEADD(DAY,@EXISTS,@RDATE)
print @RDATE