假期存储,如何存储?

时间:2011-11-13 13:30:49

标签: database

我需要在db中存储假期列表并根据holidays.holidays列表计算不同国家/地区的工作日,并且所有年份都不相同。 所以我需要根据假期来计算开始日期和结束日期之间的营业日。开始日期和结束日期可能不在同一年。 所以在这种情况下帮助我如何维护数据库设计。

3 个答案:

答案 0 :(得分: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(我认为映射到星期六和星期日)。

答案 1 :(得分:0)

假期必须依赖于地区和年份。

如果有假期下降的规则,可能会在代码中更好地表达。这些可以是您每年用于填充业务日历的触发器或存储过程。

答案 2 :(得分:0)

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

计算工作日并不简单,因为您需要定义什么是工作日。在很长一段时间内,你可以大致找到天数的差异并乘以5/7。对于小周期,你会想要更高的精度,所以应该用编程逻辑来做。