2011-11-13 38 views
0

我需要有一個假期列表來存儲在分貝和計算基於holidays.holidays列表的工作日將有所不同,不同的國家和不同的所有年份。 所以我需要按照假期計算開始和結束日期之間的工作日。開始日期和結束日期可能不在同一年。 所以在這種情況下,我應該如何維護db設計。如何存儲?

回答

0

假期必須是區域設置和年份相關的。

如果有節假日下降的規則,也許這些代碼更好地表達。這些可以是您將用於每年填充業務日曆的觸發器或存儲過程。

0
create table holidays{ 
    country_id int, 
    name text, 
    start_date date, 
    end_date date 
}default charset=utf8; 

計算工作日並不簡單,因爲您需要定義什麼是工作日。在很長一段時間內,您可以大致發現天數差異並乘以5/7。在很短的時間內,你會想要更高的精度,所以應該用編程邏輯來代替。

1

做一個表,每個國家的節日:

CREATE TABLE Holidays 
(
    Country INT NOT NULL, 
    [Date] DATE NOT NULL, 
    CONSTRAINT PK_Holidays PRIMARY KEY CLUSTERED (Country, [Date]) 
) 

然後做一個CTE列舉兩個日期之間的所有天:

WITH Dates ([Date] Date) 
AS 
(
    SELECT @StartDate 
    UNION ALL 
    SELECT DATEADD(DAY, @StartDate, 1) 
    FROM Dates Where Dates.Date < @EndDate 
) 
SELECT COUNT(1) FROM Dates 
WHERE [Date] NOT IN (SELECT [Date] from Holidays WHERE Country = @CountryCode) 
AND DATEPART(WeekDay, [Date]) NOT IN (6,7) 
WITH (MAXRECURSION = 10000) 

這會給你的工作日數。 CTE查詢建立了@StartDate和@EndDate之間所有日期的列表,然後過濾掉那些在特定國家作爲節假日列出的日期,而不是星期幾編號6或7(我認爲它映射到星期六和星期日)。

+0

能我可以得到你的命令更多的解釋 – satheesh

+0

先生,如果我對錶格定義的想法不大,那麼將會有所幫助 – satheesh

+0

@satheesh:我已經用一些更多的信息更新了我的答案。 –