【发布时间】:2017-11-17 02:35:35
【问题描述】:
下面的查询从给定变量@incoming_date 返回 3 天后的日期。问题是返回的日期不能是周末或十个联邦假日之一。例如,如果给出了今天的日期(2017 年 11 月 16 日),那么它将返回 2017 年 11 月 20 日。如果 20 日是联邦假日,它将返回 21 日。或者如果给出 11/20,则返回 11/22nd(包括今天)。为了确定它是否是假期,我将联邦假期列表放在一个名为TEST_Holiday_dates 的表中,放在一个名为Holiday_Date 的列中。
declare @incoming_date date
declare @mydate date
declare @if_date_is_Holiday date
declare @if_weekend varchar(10)
set @incoming_date = '2018-01-11' --change this date to test
set @mydate = dateadd(day, 2, @incoming_date)
set @if_date_is_Holiday = (
select Holiday_Date
from TEST_Holiday_Dates
where Holiday_Date = @mydate
)
set @if_weekend = (
select convert(varchar(10), datename(dw, @mydate))
where
convert(varchar(10), datename(dw, @mydate)) = 'Saturday'
or
convert(varchar(10), datename(dw, @mydate)) = 'Sunday'
)
--select @mydate, @if_weekend, @if_date_is_Holiday
--Is a Holiday and not a weekend
if @if_date_is_Holiday is not null and @if_weekend is null
begin
if @if_weekend = 'Friday'
begin
if (select Holiday_Date from TEST_Holiday_Dates where Holiday_Date = dateadd(day, 3, @mydate)) is null
begin
select dateadd(day, 3, @mydate)
end
else
begin
select dateadd(day, 4, @mydate)
end
end
else
begin
select dateadd(day, 1, @mydate)
end
end
--I think this is the same as "not a holiday and is a weekend logic"
--Is a Holiday and a weekend
else if @if_date_is_Holiday is not null and @if_weekend is not null
begin
if @if_weekend = 'Saturday'
begin
if (select Holiday_Date from TEST_Holiday_Dates where Holiday_Date = dateadd(day, 2, @mydate)) is null
begin
select dateadd(day, 2, @mydate)
end
else
begin
select dateadd(day, 3, @mydate)
end
end
else if @if_weekend = 'Sunday'
begin
if (select Holiday_Date from TEST_Holiday_Dates where Holiday_Date = dateadd(day, 1, @mydate)) is null
begin
select dateadd(day, 1, @mydate)
end
else
begin
select dateadd(day, 2, @mydate)
end
end
end
--Is not a Holiday and not a weekend
else if @if_date_is_Holiday is null and @if_weekend is null
begin
select @mydate
end
--Is not a Holiday but is a weekend
else if @if_date_is_Holiday is null and @if_weekend is not null
begin
if @if_weekend = 'Saturday'
begin
if (select Holiday_Date from TEST_Holiday_Dates where Holiday_Date = dateadd(day, 2, @mydate)) is null
begin
select dateadd(day, 2, @mydate)
end
else
begin
select dateadd(day, 3, @mydate)
end
end
else if @if_weekend = 'Sunday'
begin
if (select Holiday_Date from TEST_Holiday_Dates where Holiday_Date = dateadd(day, 1, @mydate)) is null
begin
select dateadd(day, 1, @mydate)
end
else
begin
select dateadd(day, 2, @mydate)
end
end
end
查询可以正常返回一个值。但是如果我想返回接下来的 3 个日期怎么办?即,如果给出今天的日期(11/16),它将返回 11/20、11/22 和 11/24(同样,日期包括在内)。我正在使用 sql-server 2014。提前致谢。
例子:
如果我这样做set @incoming_date = '2017-11-16'
它将返回日期2017-11-20
这是正确的,但我想包括接下来的 3 个包含日期,以便它返回:
2017-11-20
2017-11-22
2017-11-24
或者如果我这样做set @incoming_date = '2017-11-21'
它目前返回2017-11-24(这是正确的,因为 23 号是感恩节)
我希望它返回什么:
2017-11-24
2017-11-27
2017-11-29
【问题讨论】:
-
我很难理解你在这里想要做什么。您能否针对给定的一组参数发布一些示例数据和所需的输出?
-
@SeanLange 对此感到抱歉。我添加了几个例子。希望对您有所帮助。
-
@SeanLange 还添加了一个 rextester 示例。
-
@Simon 我觉得你把问题复杂化了。您提供了一个解决方案,该解决方案提供了一个日期,返回下一个非节假日工作日。您是否有理由不能将其设为函数或存储过程并简单地调用它 3 次?一次用于第一次约会,第二次用于第一次通话的产品,依此类推。
标签: sql-server loops