如果我想写一个查询,说我想知道当月的第四个工作日。你会怎么做?我不知道从哪里开始,主要是因为 7 月 4 日把我搞砸了……
谢谢!
大多数企业都有一个内部日历,表示组织的工作天数。这通常不包括周六、周日和组织选择遵守的任何公共假期。
我的第一条建议是看看这样的日历是否可供您使用。如果是,您的查询将变得微不足道。
假设这样的表: -
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
好消息是,即使您的组织没有日历,您也可以创建一个日历,用您对什么是工作日和什么不是工作日的最佳理解来填充它。
一个带有一些逻辑的简单循环将日期增加一天并检查工作日而不是假期就可以了。
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
试试下面的查询......它会帮助你......
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 个工作日