我想将天数(例如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
答案 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