【问题标题】:Representation of repetitive dates in SQL databaseSQL 数据库中重复日期的表示
【发布时间】:2016-09-01 03:47:25
【问题描述】:


在我的程序中,我必须管理一些假期。每个假期可以是一个确切的日期,也可以是一个重复的日期。

例如:

-6th January of each years
-first day of each month of each year

我将如何将这些信息保存在数据库中? 我不能使用Datetime,因为使用日期时间我不能代表上面例子中的特殊情况。

有什么建议吗?

如果可能的话,我正在使用 TSQL

对不起,我的英语不好。

【问题讨论】:

  • 如果我理解正确,您希望将假期列表存储在表中。因为将一列保留为仅日期(不是日期时间)。所以 holidayname varchar(255),HoliDate Date。
  • 我会创建一个日历表,用 20 年的数据填充它,而不用担心如何对数据库本身的填充规则进行编码。将它们保存在脚本/存储过程中,您可以在十年后运行(如果需要)。
  • 使用 iCalendar RRules 和 ExDates,并通过物化视图和一些 C# 生成实际日期(在时间窗口中)

标签: sql-server tsql database-design database-schema


【解决方案1】:

在不了解您对这些数据的使用情况的更多信息的情况下,简单的方法是拥有三个数字字段daymonthyear,并以这种方式解释它们:如果所有三个都被填满,那就是一天,没有其他一天。如果没有填满年,那就是日和月,每年重复。如果只有一天被填满,那就是一天,每个月重复一次。

如果您有更复杂的重复方案,则需要重复规则的属性,例如“每三个月”。

当然,每个查询都需要包含一些逻辑来解释这个方案,但这是不可避免的,除非你决定列出所有假期,比如未来 50 年。

【讨论】:

  • 有趣的思维方式+1
  • 您好,我们如何指定工作日,即每个星期日,或每个第二个星期六等?
  • OP 的问题描述中对此没有要求。当然,您可以定义一个完整的领域特定语言来描述日期功能。
【解决方案2】:

我建议使用 3 列设计来存储这些条件

  1. 指定这是Day还是WeekDay的列

  2. 要指定 Day/WeekDay Number 的列(即,1 到 30/31 表示工作日,1 到 7 表示工作日)

  3. 指定Monthly/Yearly 出现的列。(表示每月/每年)

例如:- 每个月的第一天,像这样:DAY,1,MONTHLY

每个月的第二个星期六:WEEKDAY,14*,MONTHLY(*我的一周开始是星期日)

这不是一个完美的解决方案,您可能需要添加更多列才能完全满足您的业务逻辑。

【讨论】:

  • @davidinho,你能分享一下你用来处理这个场景的设计吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
相关资源
最近更新 更多