【问题标题】:With SQL Server add x number of days to a date in sql but also pass in the number of business days in a week使用 SQL Server 将 x 天数添加到 sql 中的日期,但也传递一周中的工作日数
【发布时间】:2014-11-19 18:36:01
【问题描述】:

在 SQL Server 中,我想将 x 个工作日添加到一个日期,但还要传入一周中的工作日数。即可能是 5,6 ,7。

我在处理 5 天的堆栈溢出时发现了此问题,但不知道如何修改它,以便您可以指定每周的工作日数。

CREATE FUNCTION[dbo].[AddBusinessDays]
    (@Date date, @n INT)
RETURNS DATE AS 
BEGIN
    DECLARE @d INT;
    SET @d = 4 - SIGN(@n) * (4-DATEPART(DW, @Date));

    RETURN DATEADD(D, @n + ((ABS(@n) + @d - 2) / 5) * 2 * SIGN(@n) - @d / 7, @Date);
END

【问题讨论】:

  • 请检查我的回答。
  • 此时您可能需要考虑创建一个日历表 - 每天一行,您说的少于 4000 行以涵盖接下来的十年 - 然后您可以有列对于对您的组织很重要的日期特征(例如特定日期是否算作工作日)。有了日历表后,编写查询以查找例如下一个工作日或在日期上添加 x 个工作日往往很容易。

标签: sql sql-server tsql date


【解决方案1】:

就是这样,为了更好的理解,我把它转换成了存储过程。

我用过 SQL Server。

Alter procedure [dbo].[AddBusinessDaysP]
(@Date date,@n INT,@wds INT)
as
BEGIN
--exec AddBusinessDaysP '9/25/2014',2,4

Declare @totWeekEnds int
Set @totWeekEnds = (Case When @n > 7 then (@n / 7) else 1 end)  * (7-@wds)

Declare @totDays int

Set @totDays = @n  + @totWeekEnds

Select @n as DaysToAdd,@wds as DaysInWeek,@totWeekEnds as TotalWeekEnds,@totDays as TotalDaysToAdd,Dateadd(dd,@totDays,@Date) as Answer

END

我也把SP转换成你想要的Function了。

Alter FUNCTION[dbo].[AddBusinessDays](@Date date,@n INT,@wds INT)
RETURNS DATE AS 
BEGIN
--Select [dbo].[AddBusinessDays]('9/25/2014',2,5)

Declare @totWeekEnds int
Set @totWeekEnds = (Case When @n > 7 then (@n / 7) else 1 end)  * (7-@wds)

Declare @totDays int

Set @totDays = @n  + @totWeekEnds

Return Dateadd(dd,@totDays,@Date) 

END

【讨论】:

  • 感谢 AK47,虽然我在尝试该功能时遇到了一个问题。如果我尝试 SELECT dbo.AddBusinessDays ('2014-09-26' ,1 ,6 ) 并且 26th 是 Friday ,它应该在 27 日星期六返回,这是每周 6 天的下一个工作日,但它在 28 日星期日返回。嗯可能sql把星期天当成第一天,我不确定,得调查一下。
  • 嗯,正确,将尝试对这个问题进行排序。
猜你喜欢
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
相关资源
最近更新 更多