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