【问题标题】:Adding x work days onto a date in SQL Server?将 x 个工作日添加到 SQL Server 中的日期?
【发布时间】:2021-11-01 20:46:29
【问题描述】:

如果有一种简单的方法可以做到这一点,我有点困惑。

我的数据表中有一个名为receipt_date 的字段,我希望为此增加10 个工作日(包括银行假日)。

我不确定是否有任何类型的查询可以用来从我原来的表格中加入这个表来计算 10 个工作日,我尝试了一些子查询,但我无法正确或者它不可能做到这一点。如果我只在 WHERE 中包含“Y”,我不知道是否有办法在收货日期之后提取第 10 行来获取日历日期?

任何帮助表示赞赏。

【问题讨论】:

  • 向我们展示您的表格结构(带有receipt_date 的表格和“带有大量日期”的表格)、几行示例数据、所需的结果以及您尝试过的内容远。
  • Is there a simple way to do this? 对一个人来说简单的事情对别人来说可能很复杂。所以没有正确答案
  • 简单的答案是您需要使用带有大量日期的表格来计算工作日数,然后将该数字添加到您的列值中
  • 我尝试子查询数据,然后添加一个排名以获得第 10 个排名并按 calendar_date 排序,并且只尝试获得第 10 个日历日期,但这没有用,我有点明白为什么
  • 请阅读this,了解一些改进问题的技巧。

标签: sql sql-server tsql ssms


【解决方案1】:

这是对您的数据做出几个假设,因为我们没有。然而,一种方法是创建一个函数,我在这里使用一个内联表值函数,从您的日历表中返回相关行。请注意,这假定天数必须始终为正数,并且如果您提供的日期不是工作日,那么0 将是下一个工作日。 IE。将零工作日添加到 2021-09-05 将返回 2021-09-06,或者添加 3 将返回 2021-09-09。如果这不是您想要的,这应该足以让您自己到达那里。

CREATE FUNCTION dbo.AddWorkingDays (@Days int, @Date date) 
RETURNS TABLE AS
RETURN
    WITH Dates AS(
        SELECT CalendarDate,
               WorkingDay
        FROM dbo.CalendarTable
        WHERE CalendarDate >= @Date)
    SELECT CalendarDate
    FROM Dates
    WHERE WorkingDay = 1
    ORDER BY CalendarDate
    OFFSET @Days ROWS FETCH NEXT 1 ROW ONLY;
GO

--Using the function

SELECT YT.DateColumn,
       AWD.CalendarDate AS AddedWorkingDays
FROM dbo.YourTable YT
     CROSS APPLY dbo.AddWorkingDays(10,YT.DateColumn) AWD;

【讨论】:

  • 嘿,谢谢,不过是工作日 = 'Y' 吗?基于日历表
  • 正如我所说,我对您的数据做了几个假设,因为我没有,@paulr23。我不知道 your 日历表是什么样的,因此您需要根据您的环境更改上述内容。然而,我假设您的WorkingDay 列将被定义为bit NOT NULL;因为这是在 SQL Server 中表示真/假类型值的最简单(也是最小)的方法。
  • @paulr23 我们不知道,您没有向我们展示您的日历表。通常您使用bit 列而不是char(1),但如果您使用Y/N,希望您可以调整查询以适应。有关创建和使用日历表的提示,请参阅 this articlethis article
  • @paulr23 是的,恕我直言,您应该重新考虑该设计。
  • 我个人认为,对于这个要求,可能有 2 个 bit NOT NULL 列,WeekdayWorkingDay;使用1 表示TRUE,或“是”,而0 则相反。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
相关资源
最近更新 更多