两个日期之间的工作日数

时间:2012-06-18 11:26:10

标签: sql sql-server tsql

我想要介于两者之间的工作日数。例如,如果我们有 01-01-2012 20-01-2012 ,我想使用T-SQL获取两个日期之间的工作日数。

4 个答案:

答案 0 :(得分:7)

由于SQL Server不知道贵公司认为工作日是什么,因此这个问题的最佳答案可能是使用calendar table。如果您有一个包含过去和将来日期的表格,并且IsWorkDay这样的列已正确更新,则查询很简单:

SELECT [Date] FROM dbo.Calendar 
  WHERE [Date] >= @start 
  AND [Date] <= @end
  AND IsWorkDay = 1;

答案 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)

答案 2 :(得分:1)

我喜欢Aaron 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

这将为您提供两个日期之间的工作日计数。像许多其他人所说的那样,这显然没有考虑任何假期或我的生日。

答案 3 :(得分: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 )