如何找到一个月的第三个工作日(星期六和星期日是周末)?

时间:2019-07-23 14:06:33

标签: sql sql-server

我需要在少数情况下找到下一个最终付款期。期限为3个月,但是最后一个发薪日是本月的第3个工作日。否则,到期日为4个月。周六和周日不是工作日。例如:现在在2019年8月分别是3.08和4.08个工作日,而当客户缴纳税款至5.08(星期一-这是8月的第3个工作日)时,下一个发薪日期将一直到2019年10月结束。每天是6.08,直到11月底

IF @Schema = '1000' 
BEGIN

SET @PayPeriod = 3
IF @Payday < DATEADD(DAY, CASE (DATEPART(WEEKDAY, DATEADD(MONTH, DATEDIFF(MONTH, 0, @Payday), 0)) + @@DATEFIRST) % 7 
                                        WHEN 6 THEN 2
                                        WHEN 7 THEN 1 ELSE 0 END,
                                        DATEADD(MONTH, DATEDIFF(MONTH, 0, Payday), 3)) 
SET @PayPeriod = EOMONTH(@Payday, @PayPeriod-1)
ELSE SET @PayPeriod = EOMONTH(@Payday, @PayPeriod)
            END

这是结果。在06.08.2019之后必须是11月底的付款期

2019-08-01 2019-10-31

2019-08-02 2019-10-31

2019-08-03 2019-10-31

2019-08-04 2019-11-30 2019-08-05 2019-11-30 这是问题所在!

2019-08-06 2019-11-30

2 个答案:

答案 0 :(得分:1)

这应该对您有用:

declare @payday as datetime = '20190602'

;with cte as ( 
    select datefromparts(year(@payday), month(@payday), 1) as monthday
    union all
    select dateadd(day,  1, monthday)
    from cte
    where day(monthday) < 10

    )
select 
    case 
        when count(*) <= 3 then eomonth(@payday, 3)
        else eomonth(@payday, 4)
    end as MaturityEnd
from cte
where datepart(weekday, monthday) not in (7, 1)
 and monthday <= @payday

在这里,我们生成与付款日期相同月份的前几个日期,并计算比付款日期小的工作日。到期结束日期是根据天数计算的。

答案 1 :(得分:0)

不清楚您要从问题中得到什么。我相信您想要的是:

  • 给日期@@DATEFIRST查找到期日期
  • 3个月后,除非
  • 该日期位于一个月的前三个工作日内
  • 4个月后

对吗?

EOMONTH还做什么?与陈述的要求相比,在您的示例中使用它似乎没有意义。