在数据库中仅保存日期和月份的最佳方法

时间:2009-06-25 10:47:04

标签: database database-design date

我们必须保存每年重复活动的日期和月份。 (将其视为必须将发票发送给客户的那一年。)

我们将不得不用这些信息做一些计算。例如,如果客户每年支付两次。那么我们不仅要检查今天是否是今天,而且如果这一天是6个月。

我们现在有几种选择: a)我们将信息保存在DATE字段中但忽略年份。 b)我们在数据库date_day和date_month中创建两个int字段。 c)我们创建一个varchar字段,然后进行正则表达式并拆分例如31.12每次我们做一些计算时都会。

我们做了几次测试,发现c)肯定太慢了。但我们仍然有选项a)和b)。首先我们想要去b)但经过一些测试我们更倾向于a)。

是否有一个很好的技术原因可以让一个选项比另一个更好?

(我们目前正在使用MySQL。如果这很重要。)

8 个答案:

答案 0 :(得分:10)

我选择b),因为它更准确地反映了数据的含义。具有应该“忽略”某些部分的数据结构是有问题的。如果人们只进行简单的日期比较,假设年份始终相同,但有人使用了不同的占位符年,假设年份无关紧要怎么办?

始终使用反映您意图的数据结构。

那个c)是坏的,我相信,超出了合理的讨论:-)。而且我没有考虑性能原因......

答案 1 :(得分:2)

我会使用日期字段,即使不需要,也会保存年份。只需在打印/使用它时将其剥离。有几个原因:

  1. 您可能会在稍后发现 客户确实想要你 保存日期。在那种情况下你 不必对你的任何改变 数据库结构。
  2. 如果需要,您可以使用SQL日期函数来比较日期。如果您在单独的字段中有日期和月份,则需要更多代码,例如计算两个日期之间的差异(闰年等)。
  3. 选择b)的原因也可以通过这些SQL日期函数轻松解决。您可以轻松选择特定月份的事件,例如,在单个查询中。

答案 2 :(得分:1)

我会选择b),因为它会使查询变得更容易:您将能够以非常简单的方式恢复范围内的所有事件(12月,特定日期,日期范围)。 如果您选择a) - 请不要忘记将年份设置为特定的年份以进行比较和提取。

答案 3 :(得分:1)

我会存储第一个事件的日期,然后是每个后续事件的间隔,就像大多数日历应用程序一样。在这种情况下,你可以像这样构造它:

 first_event | interval | interval_unit
-------------+--------------------------
  2009-01-01 |        6 | 'month'
  2009-02-01 |        1 | 'year'

不幸的是,MySQL没有INTERVAL数据类型,因此需要两列和一些后期处理,但我认为这是解决问题的最灵活方式。

答案 4 :(得分:1)

我也面临同样的问题,在我的情况下,我需要根据一个月中每年重复的特定日期检索数据。我使用了“日期”。并像这样查询

SELECT * FROM test_table WHERE MONTH(date) = 1 AND DAY(date) = 14

这样的结果

enter image description here

优势

  1. 我可以使用MySQL的功能。
  2. 减少客户端计算。
  3. 可以使用date_field进行其他计算
  4. 我的建议是这样使用

    这可能对某人有帮助

答案 5 :(得分:0)

我也支持b),但是使用TINYINT表示月份(0到255)和SMALLINT(-32,768到32,767)一年可以节省一些空间。

答案 6 :(得分:0)

为1月1日选择一个int字段,如1601。

答案 7 :(得分:0)

我会查找年份编号(例如0到365之间的单个数字,然后将其添加到您感兴趣的特定年份的1月1日。

如果您不想对上述解决方案进行额外的数学计算,那么请使用两个字段,一个用于月份,一个用于一天(但请确保在需要时更新两个字段!)。

请记住,你必须处理闰年,所以使用日期字段是一个坏主意,因为你必须存储两年的日期 - 一个是闰年,一个不是 - 非常复杂!