我想要介于两者之间的工作日数。例如,如果我们有 01-01-2012 和 20-01-2012 ,我想使用T-SQL获取两个日期之间的工作日数。
答案 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 )