PeterJL Asked: 2019-11-12 13:36:35 +0800 CST2019-11-12 13:36:35 +0800 CST 2019-11-12 13:36:35 +0800 CST 计算当月的第n个工作日 772 寻找一个简单的内联语句 (MSSQL),它可以返回当月的当前工作日数(经过的天数减去周六和周日),例如 2019 年 11 月 11 日将是第 7 个工作日。 sql-server t-sql 1 个回答 Voted Best Answer Doug Deden 2019-11-13T07:47:47+08:002019-11-13T07:47:47+08:00 您的标题要求“当月的第 n 个工作日”。而你的问题的主体将其翻转并要求找到当天的“n”。我要回答正文中提出的问题。 Jeff Moden在这里写得非常好。他把它写成一个函数,带有参数和错误处理以及所有其他好东西。但是你想要它内联,所以我们只需要用 替换这些@EndDate部分GETDATE(),并用@StartDate一些日期数学替换这些部分,以获得当月的第一天。 SELECT DATEDIFF(day, DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0), GETDATE()) + 1 - DATEDIFF(week, DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0), GETDATE()) * 2 - (CASE WHEN DATENAME(WEEKDAY, DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)) = 'Sunday' THEN 1 ELSE 0 END) - (CASE WHEN DATENAME(WEEKDAY, GETDATE()) = 'Saturday' THEN 1 ELSE 0 END) as WorkdayNumber 因为您希望将其作为内联代码,所以在今天,在其他日子里测试它并不容易。但是您可以@EndDate换回以使其更易于测试。 DECLARE @EndDate DATETIME = '20191111' SELECT DATEDIFF(day, DATEADD(month, DATEDIFF(month, 0, @EndDate), 0), @EndDate) + 1 - DATEDIFF(week, DATEADD(month, DATEDIFF(month, 0, @EndDate), 0), @EndDate) * 2 - (CASE WHEN DATENAME(WEEKDAY, DATEADD(month, DATEDIFF(month, 0, @EndDate), 0)) = 'Sunday' THEN 1 ELSE 0 END) - (CASE WHEN DATENAME(WEEKDAY, @EndDate) = 'Saturday' THEN 1 ELSE 0 END) as WorkdayNumber 为 输入一些样本值@EndDate,您会得到这些结果,这似乎符合您的期望。 EndDate WorkdayNumber ------- ------------- 20191101 1 20191104 2 20191105 3 20191111 7 20191115 11 20191129 21 笔记: 这不考虑假期。 DATENAME 部分取决于您配置的语言。
您的标题要求“当月的第 n 个工作日”。而你的问题的主体将其翻转并要求找到当天的“n”。我要回答正文中提出的问题。
Jeff Moden在这里写得非常好。他把它写成一个函数,带有参数和错误处理以及所有其他好东西。但是你想要它内联,所以我们只需要用 替换这些
@EndDate
部分GETDATE()
,并用@StartDate
一些日期数学替换这些部分,以获得当月的第一天。因为您希望将其作为内联代码,所以在今天,在其他日子里测试它并不容易。但是您可以
@EndDate
换回以使其更易于测试。为 输入一些样本值
@EndDate
,您会得到这些结果,这似乎符合您的期望。笔记: