1

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

谢谢!

4

3 回答 3

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

好消息是,即使您的组织没有日历,您也可以创建一个日历,用您对什么是工作日和什么不是工作日的最佳理解来填充它。

于 2013-01-28T15:27:02.157 回答
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
于 2013-01-28T15:48:07.287 回答
-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 个工作日

于 2013-01-28T15:31:12.590 回答