Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 数据库中的银行假日模式_.net_Database - Fatal编程技术网

.net 数据库中的银行假日模式

.net 数据库中的银行假日模式,.net,database,.net,Database,我正在尝试使用.NET制作假期预订系统,并尝试计算不包括假期和银行假期的工作日。银行假期和假期应保存在数据库中。任何人都可以给出一个很好的解决方案,如何将它保存在数据库中,这样以后就可以很容易地对它进行解析和计数了?我们在一个数据库中使用了类似的东西。我们的表格结构如下: CREATE TABLE [dbo].[Holiday_Calendar]( [CloseDate] [datetime] NOT NULL, [HolidayDescription] [varchar](50

我正在尝试使用.NET制作假期预订系统,并尝试计算不包括假期和银行假期的工作日。银行假期和假期应保存在数据库中。任何人都可以给出一个很好的解决方案,如何将它保存在数据库中,这样以后就可以很容易地对它进行解析和计数了?

我们在一个数据库中使用了类似的东西。我们的表格结构如下:

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-02-29 00:00:00

如果我想要未来的约会,请使用:

select dbo.GetNextBusinessDate(getdate(),  7)

结果是
2012-03-14 00:00:00

我们在一个数据库中使用了类似的东西。我们的表格结构如下:

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-02-29 00:00:00

如果我想要未来的约会,请使用:

select dbo.GetNextBusinessDate(getdate(),  7)

结果是
2012-03-14 00:00:00

这本书有一个“寻找任意日期”的诀窍。。。基本上,它为每天创建一个日历表,用于所需的时间跨度(我制作了一个从2000年到2052年的日历表,大约是18K行)。然后是“IsWeekend”或“IsWeekday”之类的栏目。你可以修改它来添加诸如“IsBankHoliday”甚至“IsBankHolidayUk”或“IsBankHolidayUsa”等栏目。

这本书有一个“查找任意日期”的诀窍。。。基本上,它为每天创建一个日历表,用于所需的时间跨度(我制作了一个从2000年到2052年的日历表,大约是18K行)。然后是“IsWeekend”或“IsWeekday”之类的栏目。您可以调整它以添加诸如“IsBankHoliday”甚至“IsBankHolidayUk”或“IsBankHolidayUsa”等列。

是否只想要工作日,跳过周末?跳过周末和假日。@user418319我用我的函数更新了我的答案,我用它来获取下一个工作日期。您只想要工作日吗,跳过周末?跳过周末和假日。@user418319我用我用来获取下一个业务日期的函数更新了我的答案。