2012-06-18 75 views
1

我希望在两个日期之间的工作日数。例如,如果我们有01-01-201220-01-2012,我想要使用T-SQL获取这两个日期之间的工作日数。两个日期之间的工作日数

+0

做你的工作是什么天表中删除holydays?你有什么节日? – Paddy

+3

**不相关:**下一次,请使用'sql-server'而不是'sql'和'server'来标记 –

+0

首先必须知道有多少假期,然后totaldays - holidays = working days..please put your table结构 – Nighil

回答

6

由于SQL Server不知道贵公司的工作日是什么,所以对这个问题的最佳答案很可能是使用calendar table。一旦你过去和将来的日期表,与像IsWorkDay正确更新一栏,查询很简单:

​​
+0

相关/可能重复日历表是真正处理“工作日”概念含糊不清的最佳选择。 –

+0

这个答案中的链接是死的,有没有可以链接到它的存档? –

+1

@詹姆斯抱歉,已更新。一群邪恶的人接管了这个领域,并装上了废话。 –

3
DECLARE @fromDate datetime, @toDate datetime 
SELECT @fromDate = ' 01-01-2012', @toDate = '20-01-2012' 

SELECT (DATEDIFF(day, @fromDate, @toDate) + 1) 
     - (DATEDIFF(week, @fromDate, @toDate) * 2) 
     - (CASE WHEN DATENAME(weekday, @fromDate) = 'Sunday' THEN 1 ELSE 0 END) 
     - (CASE WHEN DATENAME(weekday, @toDate) = 'Saturday' THEN 1 ELSE 0 END) 
+0

这处理标准工作周(星期一至星期五),但不处理非工作日(假期,学校PA日等)。它还假定语言设置是“US_English”或类似的。你用不同的'SET DATEFIRST'设置测试过它吗? –

1

我喜欢亚伦Bertrand的建议,所以我写了这个代码,可以添加到您的查询。它会在两个日期之间创建一个表变量,然后通过加入CalendarDate列,您可以在查询中使用它(只需记住在加入之前删除任何时间信息)。这是基于周一至周五典型的美国工作周。

DECLARE @StartDate DATE 
DECLARE @EndDate DATE 

SET @StartDate = '2013-08-19' 
SET @EndDate = '2013-08-26' 

DECLARE @BusinessDay TABLE 
(
    CalendarDate DATETIME, 
    IsBusinessDay INT 
) 

DECLARE @Counter DATETIME = @StartDate 
WHILE(@Counter <= @EndDate) 
BEGIN 
    INSERT INTO @WorkDays 
    SELECT @Counter, CASE WHEN DATENAME(WEEKDAY, @Counter) NOT IN ('Saturday', 'Sunday') THEN 1 ELSE 0 END 
    SET @Counter = DATEADD(DAY, 1, @Counter) 
END 

SELECT * FROM @BusinessDay 

缺点是这必须重新为每个需要的查询,所以如果你经常这样做,一个固定的表可能是一个更好的路要走。

它可以用来像这样....

SELECT 
    BusinessDays = SUM(IsBusinessDay) 
FROM 
    @BusinessDay 
WHERE 
    CalendarDate BETWEEN @StartDate AND @EndDate 

这会给你的两个日期之间的工作日数。像其他许多人所说,这显然不考虑任何假期或我的生日。

0

基于前面的代码,我调整它以排除最后一天(没问,但我需要它)。

select (DATEDIFF(dd,@fromDate, @toDate))  
- (DATEDIFF(ww,@fromDate, DATEADD(dd,-1,@toDate)) * 2) 
- (CASE WHEN DATENAME(dw, @fromDate) = 'Sunday' THEN 1 else 0 end) 
- (CASE WHEN DATENAME(dw, @toDate) = 'Sunday' THEN 1 else 0 end) 

我通过使用含有这些日期

- (select count(distinct dcsdte) 
    from calendar_table 
    where dcsdte between @fromDate 
     and @toDate) 
相关问题