Database SQL数据类型-如何存储一年?

Database SQL数据类型-如何存储一年?,database,types,sqldatatypes,Database,Types,Sqldatatypes,我需要在数据库中插入一年(例如:1988年、1990年等)。当我使用Date或Datetime时 数据类型,它显示错误。我应该使用哪种数据类型 就一年,没有别的了? 为什么不使用一个简单的整数呢 如果只需要存储年份,请使用整数。如果您认为在查询此列时会进行基于日期的计算,那么也可以使用datetime如果您需要在数据库中存储年份,您可以使用整数数据类型(如果您死心塌地只存储年份)或datetime数据类型(这将涉及存储一个基本上是1/1/1990 00:00:00格式的日期)。常规的4字节INT

我需要在数据库中插入一年(例如:1988年、1990年等)。当我使用Date或Datetime时
数据类型,它显示错误。我应该使用哪种数据类型

就一年,没有别的了?
为什么不使用一个简单的整数呢

如果只需要存储年份,请使用整数。如果您认为在查询此列时会进行基于日期的计算,那么也可以使用datetime

如果您需要在数据库中存储年份,您可以使用整数数据类型(如果您死心塌地只存储年份)或datetime数据类型(这将涉及存储一个基本上是1/1/1990 00:00:00格式的日期)。

常规的4字节INT太大了,是浪费空间!


你没有说你在使用哪个数据库,所以我不能推荐一个特定的数据类型。每个人都说“使用整数”,但大多数数据库存储的整数是4个字节,这远远超过了你的需要。你应该使用两个字节的整数(SQL Server上的smallint),这将更好地节省空间。

嘿,你可以使用year()MySQL中的数据类型 它有两位数或四位数格式


注:四位格式允许的值:1901到2155。两位格式允许的值:70到69,表示从1970年到2069年的年份。在MSSQL中存储“年”在理想情况下取决于您使用它做什么以及“年”的含义对于您的应用程序和数据库而言,这可能是一个问题。也就是说,这里有几点需要说明。MSSQL中截至2012年的年份没有“数据类型”。我倾向于使用SMALLINT,因为它只有2个字节(为您节省INT所需的4个字节中的2个)。您的限制是,您不能拥有比32767早一年的数据(从SQL Server 2008R2开始)我真的不认为SQL是一万年后选择的数据库,更不用说32767了。你可以考虑一下,在MSSQL中,int作为年份()函数,可以转换数据类型“日期”。对于INT。正如我所说,这取决于您从何处获取数据以及数据将流向何处,但SMALLINT应该很好。INT将是过分的…除非您有其他原因,如我上面提到的原因,或者代码要求需要INT形式的数据(例如,与现有应用程序集成)。最有可能的情况是SMALLINT应该很好。

存储可能只是问题的一部分。如何在查询中使用此值

它将与其他日期时间数据类型进行比较,还是所有关联的行也将具有数值

您将如何处理需求的变化?您对以较小时间段替换一年的请求的反应有多容易?即,现在他们希望按季度细分


数字类型可以很容易地在日期时间查询中使用,方法是使用一个查找表来连接包含开始日期和停止日期(1/1/X到12/31/X)之类的内容等。

我不认为使用整数或整数的任何子类型是一个好的选择。迟早你将不得不对其执行其他类似日期的操作。同样在2019年,让我们不要担心太多的空间。看看2000年节省的2字节花费了我们多少

我建议使用+0101年的日期转换为真实日期。类似地,如果需要存储一年中的一个月,请将year+month+01存储为真实日期


如果你已经这样做了,你将能够正确地做“约会的事情”稍后,您将尝试在数据库中插入一年,然后使用:
键入year
嘿!您为什么要使事情变得如此简单?我们将没有这么多问题了!通常情况下,使用int浪费空间比使用较小的数据类型更可取,因为大多数现代处理器处理4 byt的效率更高e整数(32位)“比更小的数据类型更重要。@Ender,你并不是在计算这些值,它更多的是一个存储和查找过程。如果值更小,你可以在ram中存储更多的值,如果值更小,你可以从磁盘读取更多的值,等等。我找不到任何支持你想法的文章。所有程序都编译到机器上。”在现代CPU架构中,所有寄存器都是32位或64位的。因此,您的RDBMS系统必须将这些数字放入寄存器中,以便进行比较,以满足查询中的条件。对于小整数和小整数,它必须每次进行转换,这很费时。你找不到一篇官方文章支持我的观点或你的观点,因为这通常是CPU和IO之间的折衷,因为使用int会增加索引大小,需要更多IO@ender,总是有权衡,我会选择优化IO(和更小的数据类型),既然IO通常是X的主要瓶颈,为什么要用4个字节来存储一年?一个字符(4)使用四个字节。我的答案建议使用两个字节的int,这是SQL Server上的
smallint
,可以存储范围:-32768到32767的值,这足以存储一年。您希望使用尽可能少的空间,因为您可以修复每页的更多数据和/或内存中的更多数据和/或内存中的更多索引等。如果我使用smallint和char(4)您将使用两倍的空间/内存来存储相同的数据。数据库处理您的
char(4)
比我的
smallint
要花费更长的时间和更多的精力。不要偷懒,“只使用int”。正确调整数据类型的大小,两字节int是一个更好的选择。通过在4字节中存储4位年份,您将浪费比磁盘空间更多的资源。您的系统将永远承受使用两倍的缓存、推送两倍的IO数据量等的负担。这是一个简单的选择,请参阅:B-B-但32768年又如何呢问题?(j/k)@KM。我同意这是一个应该完成的简单优化,但我们不要一想到不做就过于紧张。不是每个项目都会看到任何显著的差异。@KM.I a