Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql server,日期不是周末或特定日期_Sql_Sql Server - Fatal编程技术网

sql server,日期不是周末或特定日期

sql server,日期不是周末或特定日期,sql,sql-server,Sql,Sql Server,我试图编写一个SQLWhile循环来增加一个日期,直到它不匹配另外两个表中的日期,而不是周六或周日 像这样的 DECLARE @DueDate datetime SELECT @DueDate = datetime FROM tbl_status WHERE (parent_id = @ComplaintId) WHILE((SELECT COUNT(date) FROM tbl1 WHERE(date = @DueDate)) > 0 AND (SELECT COUNT(date) FR

我试图编写一个SQLWhile循环来增加一个日期,直到它不匹配另外两个表中的日期,而不是周六或周日

像这样的

DECLARE @DueDate datetime
SELECT @DueDate = datetime FROM tbl_status WHERE (parent_id = @ComplaintId)
WHILE((SELECT COUNT(date) FROM tbl1 WHERE(date = @DueDate)) > 0 AND (SELECT COUNT(date) FROM tbl2  WHERE(date = @DueDate)) > 0 AND DATEPART(d,@DueDate) = 'Saturday' AND  DATEPART(d,@DueDate) = 'Sunday')
BEGIN
    @DueDate = DATEADD(d,1,@DueDate)
END
有人能帮忙吗


谢谢

正如我在评论中提到的,您使用while循环以一种非常低效的方式进行此操作

如果在查找中没有要使用的日期表,可以使用派生表(也称为公共表表达式)创建一个日期表:

-- Set up the test data:
declare @t1 table (d date);
declare @t2 table (d date);
insert into @t1 values('20161230'),('20170111'),('20170110');
insert into @t2 values('20161225'),('20170105'),('20170106');

-- Declare your DueDate:
declare @DueDate date = '20170105';


-- Use a CTE to build a table of dates.  You will want to set the Start and End dates automatically with SELECT statements:
declare @DatesStart date = '20161201';
declare @DatesEnd date = '20170225';

with Tally0 as
(
    select x from (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) as x(x)
)
,Tally1 as
(
    select row_number() over (order by (select null))-1 as rn
    from Tally0 t1              -- 10 rows      -- Add more CROSS APPLY joins 
        cross apply Tally0 t2   -- 100 rows     -- to get enough rows to cover
        cross apply Tally0 t3   -- 1000 rows    -- your date range.
)
,Dates as
(
    select dateadd(d,t.rn,@DatesStart) as DateValue
    from Tally1 t
    where t.rn <= datediff(d,@DatesStart,@DatesEnd)
)
select min(d.DateValue) as NextDate     -- SELECT the next available Date.
from Dates d
    left join @t1 t1
        on(d.DateValue = t1.d)
    left join @t2 t2
        on(d.DateValue = t2.d)
where t1.d is null                      -- That isn't in either table
    and t2.d is null                    -- and isn't on a Saturday or Sunday.
    and datename(weekday,d.DateValue) not in('Saturday','Sunday')
    and d.DateValue > @DueDate

问题是,你不应该使用循环。您应该使用一个基于集合的方法来查找大于源日期的最小日期,该日期不在其他两个表或星期六/星期日中。由于您正在讨论性能,您可能需要重新考虑使用这样的递归cte。您拥有的基本上与循环相同,但它看起来是基于集合的,因为没有循环。看看这篇关于这个主题的文章。使用计数表代替递归cte将有助于查询的这一部分。因为这是一个很好的解决方案,所以我不考虑+1@SeanLange右边是,编辑到理货台方法。