我们必须保存每年重复活动的日期和月份。 (将其视为必须将发票发送给客户的那一年。)
我们将不得不用这些信息做一些计算。例如,如果客户每年支付两次。那么我们不仅要检查今天是否是今天,而且如果这一天是6个月。
我们现在有几种选择: a)我们将信息保存在DATE字段中但忽略年份。 b)我们在数据库date_day和date_month中创建两个int字段。 c)我们创建一个varchar字段,然后进行正则表达式并拆分例如31.12每次我们做一些计算时都会。
我们做了几次测试,发现c)肯定太慢了。但我们仍然有选项a)和b)。首先我们想要去b)但经过一些测试我们更倾向于a)。
是否有一个很好的技术原因可以让一个选项比另一个更好?
(我们目前正在使用MySQL。如果这很重要。)
答案 0 :(得分:10)
我选择b),因为它更准确地反映了数据的含义。具有应该“忽略”某些部分的数据结构是有问题的。如果人们只进行简单的日期比较,假设年份始终相同,但有人使用了不同的占位符年,假设年份无关紧要怎么办?
始终使用反映您意图的数据结构。
那个c)是坏的,我相信,超出了合理的讨论:-)。而且我没有考虑性能原因......
答案 1 :(得分:2)
我会使用日期字段,即使不需要,也会保存年份。只需在打印/使用它时将其剥离。有几个原因:
选择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
这样的结果
优势
我的建议是这样使用
这可能对某人有帮助
答案 5 :(得分:0)
我也支持b),但是使用TINYINT表示月份(0到255)和SMALLINT(-32,768到32,767)一年可以节省一些空间。
答案 6 :(得分:0)
为1月1日选择一个int字段,如1601。
答案 7 :(得分:0)
我会查找年份编号(例如0到365之间的单个数字,然后将其添加到您感兴趣的特定年份的1月1日。
如果您不想对上述解决方案进行额外的数学计算,那么请使用两个字段,一个用于月份,一个用于一天(但请确保在需要时更新两个字段!)。
请记住,你必须处理闰年,所以使用日期字段是一个坏主意,因为你必须存储两年的日期 - 一个是闰年,一个不是 - 非常复杂!