sql server,日期不是周末或特定日期
我试图编写一个SQLWhile循环来增加一个日期,直到它不匹配另外两个表中的日期,而不是周六或周日 像这样的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
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右边是,编辑到理货台方法。