我正在尝试使用.NET预订系统,并尝试计算工作日,不包括假期和银行假日。银行假日和假日应保存在数据库中。任何人都可以提供一个很好的解决方案,如何将其保存在数据库中,以后可以很容易地解析它并计算?
答案 0 :(得分:1)
我们在一个数据库中使用了类似的东西。我们的表结构如下:
CREATE TABLE [dbo].[Holiday_Calendar](
[CloseDate] [datetime] NOT NULL,
[HolidayDescription] [varchar](50) NOT NULL,
[BankHoliday] [bit] NOT NULL
) ON [PRIMARY]
然后,此结构允许您跟踪假期的所有日期。使用BankHoliday
位字段可以区分处理的非银行假日。
这是我用来获取下一个营业日期的功能 - 跳过周末和假期。您传入开始日期,然后传递要抵消的天数:
CREATE FUNCTION [dbo].[GetNextBusinessDate]
( @startDate SmallDateTime,
@offsetDays int
)
RETURNS SmallDateTime
AS
BEGIN
DECLARE @nextBusDay SmallDateTime
DECLARE @weekDay int
DECLARE @direction int
DECLARE @dayLoop int
SET @nextBusDay = Convert(smalldatetime, Convert(varchar(10), @startDate, 101))
SET @direction = @offsetDays/ABS(@offsetDays) -- 1=Younger, -1=Older
SET @dayLoop = 0 --
WHILE @dayLoop < ABS(@offsetDays) --
BEGIN
SET @nextBusDay = DateAdd(d,@direction,@nextBusDay) -- First, get the raw next day
SET @weekDay =((@@dateFirst + DatePart(dw, @nextBusDay)-2) % 7) + 1 --
WHILE (@weekDay = 6 OR -- Saturday
@weekDay = 7) -- Sunday
BEGIN
SET @nextBusDay = DateAdd(d,@direction,@nextBusDay)
SET @weekDay =((@@dateFirst + DatePart(dw,@nextBusDay)-2) % 7) + 1
END
SELECT @nextBusDay = dbo.GetNextBusinessDate(@nextBusDay,@direction)
WHERE EXISTS (SELECT CloseDate
FROM dbo.Holiday_Calendar
WHERE CloseDate = @nextBusDay
)
-- NEXT DAY
SET @dayLoop = @dayLoop + 1 -- Always use +1 as it is compaired to absolute value of the number of days
END
RETURN @nextBusDay
END
所以如果我今天(2012年3月5日)运行以下内容:
select dbo.GetNextBusinessDate(getdate(), -3)
结果为2012-02-29 00:00:00
如果我想要将来使用日期:
select dbo.GetNextBusinessDate(getdate(), 7)
,结果为2012-03-14 00:00:00
答案 1 :(得分:0)
这本书http://www.apress.com/9781430242000有一个“寻找任意日期”的方法......基本上它为每天创建一个日历表,达到所需的时间跨度(我做了一个从2000年到2052年;大约是18K行)。然后它有像“IsWeekend”或“IsWeekday”这样的列。您可以调整它以添加“IsBankHoliday”或“IsBankHolidayUk”或“IsBankHolidayUsa”等列。