sql计算当月的'x'工作日

时间:2013-01-28 15:17:38

标签: sql-server

如果我想写一个说我想知道当月第4个工作日的查询。你会怎么做?我不知道从哪里开始主要是因为7月4日让我搞砸了......

谢谢!

3 个答案:

答案 0 :(得分:2)

大多数企业都有一个内部日历,表示组织工作的日子。这通常不包括该组织选择观察的星期六,星期日和公众假期。

我的第一条建议是看看这样的日历是否可供您使用。如果是,则您的查询变得微不足道。

假设一个像这样的表: -

CREATE TABLE [dbo].[CalendarDays](
    [CalendarDayId] [int] IDENTITY(1,1) NOT NULL,
    [CalendarDate] [datetime] NOT NULL,
    [IsWorkingDay] [bit] NOT NULL,
)

..您的查询变为......

SELECT MIN(CalendarDate) FROM CalendarDays 
WHERE CalendarDate >= '2013-01-01' AND IsWorkingDay = 1

好消息是,即使您的组织没有日历,您也可以创建一个日历,充分了解您的工作日和非工作日。< / p>

答案 1 :(得分:0)

一个简单的循环,带有一些逻辑,可以将日期增加一天,并检查工作日而不是假期。

BEGIN
-- some table with known holiday values
DECLARE @tblHolidays TABLE(holiday DATETIME)
INSERT INTO @tblHolidays(holiday) VALUES ('2013-7-4')
-- parameters
DECLARE @month DATETIME
DECLARE @businessDay INT
SET @month = '2013-7-1'
SET @businessDay = 5
-- logic, loop and find only business days
DECLARE @count INT
SET @count = 0
WHILE 1=1
    BEGIN
    IF DATENAME(weekday, @month) IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday')
     AND @month NOT IN (SELECT * FROM @tblHolidays)
        BEGIN SET @count = @count + 1 END
    IF @count < @businessDay
        BEGIN SET @month = @month + 1 END
        ELSE
        BEGIN BREAK END
    END
SELECT @month
END

答案 2 :(得分:-1)

尝试以下查询...它会帮助你......

DECLARE @startdate DATETIME 
DECLARE @count INT 
DECLARE @NDay INT 

SET @startdate='07/01/2013'  --Date of the month
SET @count=0 
set @NDay = 4 --Nth businessday

WHILE @count < @NDay 
  BEGIN 
      IF Datename(dw, @startdate) NOT IN ( 'Saturday', 'Sunday' ) 
        BEGIN 
            SET @startdate=Dateadd(dd, 1, @startdate) 
            SET @count=@count + 1 
        END 
      ELSE 
        BEGIN 
            SET @startdate=Dateadd(dd, 1, @startdate) 
        END 
  END 

SELECT @startdate - 1 'BussinessDay'

结果2013-07-04 00:00:00.000 .... 7月第4个工作日