【发布时间】:2019-09-06 16:50:11
【问题描述】:
我正在尝试在我的表中查询日期字段介于 10 个工作日前和今天之间的记录。我正在努力计算 10 个工作日前的日期。
就我而言,假期无关紧要。无论假期/工作日如何,我只需要包括周一 - 周五。
我找到了这个 SQL 代码,它可以满足我的要求,但是是倒退的。这计算了两个日期之间的工作日数,我需要减去一个数字并得到一个日期。
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = '2019-08-26'
SET @EndDate = GETDATE()
SELECT
(DATEDIFF(dd, @StartDate, @EndDate) + 1)
-(DATEDIFF(wk, @StartDate, @EndDate) * 2)
-(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END)
我尝试过使用DATEADD,但无法找出排除周六和周日的任何逻辑。我也不想使用一个函数,我不是绝对必须的。如果没有每天循环播放的功能,我无法在线找到有关 DATEADD 的任何信息。
所需功能:
START DATE: TODAY / GETDATE()
NUMBER OF BUSINESS DAYS: 10
DATEADD(DAY, -10 + CALULATE WEEKEND DAYS?, GETDATE())
【问题讨论】:
-
可能最简单、最灵活、最模块化、最易维护的方法就是生成一个日期表,简单地统计开始日期和结束日期之间的行数,不包括周末天数(例如@ 987654324@)。以数学方式和内联方式进行比较可能会非常复杂,并且难以验证所有特殊情况。 (编辑:重做评论以修复格式。)
-
如果只关心周末而忽略节假日,可以使用如下公式:
DATEADD(DAY, -7*(@bdays / 5) + @bdays % 5, @start_date)。然后如果结果落在星期六减去 1 天,如果它落在星期日减去 2 天。 -
上述公式有误,但无法编辑评论。正确的是:
DATEADD(DAY, -7*(@bdays / 5) - @bdays % 5, @start_date). -
@P.Kouvarakis 我不得不稍微修改一下以使其包含开始日期(我忘了提及 - 抱歉),但在写了一个案例语句以捕获它之后它工作了周六或周日结束。谢谢。如果您想将其作为完整答案输入,我很乐意接受。
-
我将支持史蒂夫的上述建议。在诸如此类的多种情况下,日期表可以方便且简单/干净。
标签: sql sql-server dateadd