Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在数据库中,如果只需要年和月,您会使用日期字段还是年和月字段?_Sql_Mysql_Database Design_Database - Fatal编程技术网

Sql 在数据库中,如果只需要年和月,您会使用日期字段还是年和月字段?

Sql 在数据库中,如果只需要年和月,您会使用日期字段还是年和月字段?,sql,mysql,database-design,database,Sql,Mysql,Database Design,Database,我正在摆好一张桌子,在那里我需要年份和月份。在MySQL中,我相信我有两个选项:(1)2个字段:1个表示年,1个表示月,或者(2)一个日期字段(日期总是1) 这两个字段的优点是速度更快(我认为),因为MySQL不必将日期值转换为整数,尽管这可能可以忽略不计。日期字段具有“自动”验证的优点:有人不能在月份为13或年份为1时将数据输入数据库。使用日期字段,您还可以更轻松地进行日期计算(即,月与月之间) 你会用哪一种?或者您会使用另一个吗?使用日期字段。由于sql本机支持日期字段,因此使用WHERE子

我正在摆好一张桌子,在那里我需要年份和月份。在MySQL中,我相信我有两个选项:(1)2个字段:1个表示年,1个表示月,或者(2)一个日期字段(日期总是1)

这两个字段的优点是速度更快(我认为),因为MySQL不必将日期值转换为整数,尽管这可能可以忽略不计。日期字段具有“自动”验证的优点:有人不能在月份为13或年份为1时将数据输入数据库。使用日期字段,您还可以更轻松地进行日期计算(即,月与月之间)


你会用哪一种?或者您会使用另一个吗?

使用日期字段。由于sql本机支持日期字段,因此使用WHERE子句可以很容易地筛选特定日期

这两个字段的优点是速度更快[…]


您的SELECT查询不是您的瓶颈,因此您不必担心这一点。可读性和实用性程序比“感知瓶颈”更重要。

如果要在日期字段上运行大量操作,那么我会将其拆分为单独的列,并在表约束或DAL中处理数据验证

例如,拆分字段时,按天、月、年生成销售报告的效率要高得多。原因是您不必使用datetime函数来拆分日期进行分组


如果是生日之类的事情,我可能会偶尔查询一下,那么我就不必担心它,只需将它保留在日期字段中。

我会使用日期字段,即使您只需要年份和月份,也不会因为收集所有数据而丢失任何东西。作为一种标准做法,我总是尽可能收集所有数据。

可能不是因为SQL Server(Microsoft)中最小的日期时间数据类型是4字节长的
smalldatetime
。如果只需要月份和年份,那么月份需要1字节,年份需要2字节。

我会使用单独的列,主要是因为这样可以更好地使用索引。例如,如果您只关心某个月(而不是某一年)的数据,我认为datetime列上的索引不会有任何帮助。

尽管您不会立即使用,但IBM Informix Dynamic Server支持以下类型:

DATETIME YEAR TO MONTH
它存储的正是您想要的-年份和月份。它有它的用途。DATETIME类型家族包括许多其他偶尔会有用途的类型,还有一些是边际效用的,典型的例子是DATETIME月到分钟。(该类型的缺点是需要详细的符号来操作它,但有许多操作可以在任何或所有DATETIME类型上完成。)

在许多DBMS中,您可以在列上放置约束,因此如果使用两列方法,您将在列上放置
检查(month\u column介于1和12之间)
约束,以确保用户没有在表中放置无效值。您甚至可以对“年份”列应用约束


此外,有些DBMS允许您创建用户定义的类型,而一年一月的类型是非常简单的。当然,细节取决于DBMS。

除非将年份和月份分开存储有特定的性能优势,否则我会坚持使用日期。关于索引,如果有两列,则需要在列的组合上创建索引,而不是为日期列创建索引。日期将在内部转换为长值,因此所需的存储空间实际上不是问题

此外,考虑两个字段可能带来的维护困难。您将有两个db字段,一个对象上可能有两个字段,或者需要在db中构建/解析月份和年份。用日期保持简单,让数据库跟踪您的数据完整性


我处理的数据和您描述的一样-到期日期,其中日期始终是当月的最后一天,所以我们只需要月份和年份。我们将它们存储为日期。

我将保留一个datetime列和两个计算列,其中包含月份和年份(当然是索引)。吃我的蛋糕,也吃它:)

如果您预期的查询形式是“在7月份给我所有行,不管年份”,那么使用单独的月份和年份列将更容易编写。月列的单独索引应使其快速

否则,我会选择单日期列:简单、易懂、内置的验证和日期数学函数。你唯一担心的是,新设计的人会想,为什么每个月的第一天都会发生


使用我遇到的单独的月份和年份列还有一个原因:当月份未知时。我已经将其用于允许即将到来的事件“在2009年的某个时候”的应用程序。在这种情况下,在月份列中使用NULL可以很好地解决问题。使用日期类型列没有简单的方法可以做到这一点,除非你想出了一些可怕的技巧,比如1月2日意味着月份未知。

这样想:有一天,有人会向你提出要求,要求增强应用程序,不仅可以保存年份和月份,还可以保存一天。 那么,你会为一天增加一个额外的栏目吗? 然后,接下来,他们可能希望你也节省时间

如果年/月/日有单独的列,那么增强功能有多容易?如果只有一个日期列


仅出于这个原因,我会选择日期列。

我同意大多数人的看法,但如果列的名称是年和月,可读性问题在哪里?选择[…]其中日期介于“02-01-2009”和“04-31-2010”之间,而选择[…]其中年份介于2009年和2010年之间,月份介于2和4之间。。不要回答这个问题。我想这是主观的。那些select语句并不完全相同。第二个