2011-11-13 3 views
0

私は、DBに保存する休日のリストを持っている必要があり、休日に基づいて営業日を計算します。休暇リストは、国によって異なり、すべての年に同じではありません。 ので、休日ごとに開始日と終了日の間の営業日を計算する必要があります。開始日と終了日は同じ年ではない可能性があります。 このケースでは、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は、2つの日付の間のすべての日列挙しますあなたの営業日のカウントを与える

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:私はいくつかの情報で私の答えを更新しました。 –

関連する問題