【问题标题】:Loop in a query to return the next 3 values from given variable循环查询以返回给定变量的下 3 个值
【发布时间】:2017-11-17 02:35:35
【问题描述】:

REXTESTER Sample

下面的查询从给定变量@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


【解决方案1】:

将您在问题中提供的查询放入存储过程或函数中。例如:

dbo.ProcedureThatReturnsNextBusinessDay(@BaseDate DateTime, @Result DATETIME OUTPUT)

然后为您想要检索的每个日期调用它。在您的问题中,您说您想要接下来的 3 个日期:

DECLARE @BaseDate DATETIME = '11/20/2017',
        @DateOne DATETIME,
        @DateTwo DATETIME,
        @DateThree DATETIME;

EXEC dbo.ProcedureThatReturnsNextBusinessDay @BaseDate, @DateOne OUTPUT
EXEC dbo.ProcedureThatReturnsNextBusinessDay @DateOne, @DateTwo OUTPUT
EXEC dbo.ProcedureThatReturnsNextBusinessDay @DateTwo , @DateThree OUTPUT

现在您想要的三个日期存在于变量 @DateOne@DateTwo@DateThree 中。

【讨论】:

  • 没想到会这样。谢谢,我最终将我的查询创建为一个函数,并让一个存储过程执行了 3 次。
猜你喜欢
  • 1970-01-01
  • 2018-03-09
  • 2021-11-04
  • 2020-12-15
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
相关资源
最近更新 更多