我需要在少数情况下找到下一个最终的支付期。到期日为3个月,但最后一个发薪日为当月的第3个工作日。Оtherwise 是成熟期 4 个月。周六和周日不是工作日。例如:现在在2019年8月是3.08和4.08不是工作日,当客户在5.08(星期一 - 这是8月的第3个工作日(之前缴纳税款时,下一个发薪日期是直到2019年慕尼黑啤酒结束。否则,当这一天是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
这应该适合您:
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
在这里,我们生成与付款日期相同的月份的前几个日期,并计算小于付款日期的工作日。到期结束日期是根据天数计算的。
目前还不完全清楚你想从你的问题中得到什么。 我相信你想要的是:
- 给出一个日期
@@DATEFIRST
找到一个到期日期 - 3个月后,除非
- 该日期在一个月的前 3 个工作日,然后
- 4个月后
这是对的吗?
还有EOMONTH是做什么的? 与规定的要求相比,在您的示例中使用它似乎没有意义。