我正在建立一张表,我需要年份和月份。在MySQL中我相信我有两个选择:(1)2个字段:1年,1月或(2)日期字段(日期总是1)。
2个字段的优点是更快(我认为),因为MySQL不必将值从日期转换为整数,尽管这可能是微不足道的。日期字段具有“自动”验证的优势:有人无法将数据导入数据库,月份为13或年份为1.使用日期字段,您还可以更轻松地进行日期计算(即,数月之间) )。
你会用哪个?或者你会使用另一个吗?答案 0 :(得分:19)
使用日期字段。由于sql本身支持日期字段,因此可以使用WHERE子句轻松过滤特定日期。
这两个领域的优点是更快[...]
您的SELECT查询不是您的瓶颈所以您不必担心这一点。可读性和实用程序比“感知瓶颈”更重要。
答案 1 :(得分:1)
如果要在日期字段上运行大量操作,那么我将它拆分为单独的列,并在表约束或DAL中处理数据验证。
例如,按字段分割时,按日,月,年构建销售报表会更有效。原因是您不必使用日期时间功能来撕掉分组日期。
如果它像生日那样我可能会偶尔查询一下,那么我就不会担心它而只是将它留在日期字段中。
答案 2 :(得分:1)
我会使用日期字段,即使您只需要收集所有数据而不会丢失任何东西的年份和月份。作为一种标准做法,我总是尽可能地收集所有数据。
答案 3 :(得分:1)
我会使用单独的列,主要是因为这样可以更好地使用索引。例如,如果您只关心某个月(而非年份)的数据,我认为日期时间col的索引不会有所帮助。
答案 4 :(得分:1)
虽然没有立即使用,但IBM Informix Dynamic Server支持以下类型:
DATETIME YEAR TO MONTH
这可以存储您想要的 - 年份和月份。它有它的用途。 DATETIME类型系列包括偶尔有其用途的许多其他类型 - 有些具有边际效用,规范示例为DATETIME MONTH TO MINUTE。 (该类型的缺点是需要操作它的详细符号,但是可以在任何或所有DATETIME类型上执行许多操作。)
在许多DBMS中,您可以对列进行约束,因此如果采用双列方法,则会在列上放置CHECK(month_column BETWEEN 1 AND 12)
约束,以确保用户没有放置无效值桌子。您甚至可以在年份列上应用约束。
此外,一些DBMS允许您创建用户定义的类型,并且年月类型非常简单。当然,细节取决于DBMS。
答案 5 :(得分:1)
除非单独存储年份和月份具有特定的性能优势,否则我会坚持使用日期。关于索引,如果有两列,则需要在列的组合上创建索引,而不是为日期列创建一个索引。日期将在内部转换为长值,因此所需的存储空间实际上不是问题。
另外,考虑两个领域可能的维持疼痛。您将有两个数据库字段,可能是对象上的两个字段,或者需要构建/解析数据库中的月份和年份。使用日期保持简单,让数据库跟踪您的数据完整性。
我使用您描述的数据 - 到期日,其中一天始终是该月的最后一天,因此我们只需要月份和年份。我们将这些存储为日期。
答案 6 :(得分:1)
我会保留一个datetime列和两个带月和年的计算列(当然是索引)。吃我的蛋糕,也吃它:)。
答案 7 :(得分:1)
如果您预期查询“7月份所有行中的gimme,无论年份如何”,那么使用单独的月份和年份列编写它们会更容易一些。 月份列的单独索引应使其变得活泼。
否则,我会选择单日期列:简单,理解,内置验证和日期数学函数。你唯一担心的是,设计新手会想知道为什么一切都会在这个月的第一天发生。
我还遇到了另外一个使用单独的月份和年份列的原因:当月份未知时。我已经将它用于允许即将到来的活动“在2009年的某个时间”的应用程序。在这种情况下,在月份列中使用NULL可以很好地解决问题。使用日期类型的列没有简单的方法,除非你想出一些可怕的黑客,比如1月2日意味着月份未知。
答案 8 :(得分:1)
以这种方式思考:有一天,有人会向你提出要求增强应用程序的能力,不仅可以保存年份和月份,还可以保存一天。 您是否会在一天内添加额外的列? 然后,接下来,他们可能希望您也节省时间。
如果您有年/月/日的单独列,那么增强功能会有多容易?如果您有一个日期列?
出于这个原因,我会选择日期专栏。
答案 9 :(得分:0)
可能不是因为SQL Server(Microsoft)中最小的日期时间数据类型是smalldatetime
,其长度为4个字节。如果你只需要一个月和一年,那么你需要一个月的1个字节和一年的2个字节。