Sql 年和月使用什么类型的数据类型?

Sql 年和月使用什么类型的数据类型?,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我必须在表中存储年份和月份,下个月还有两列主题和主题详细信息我应该使用什么数据类型 我是否应该使用smalldatetime并通过像09/01/2011这样的日期来存储它们 我应该使用两列varchar或int来存储单独的年份和日期吗 2011年这样的月份09 我应该使用一列varchar来存储它们并将它们串联起来吗 比如201109 已编辑 我还想补充一点,我必须在搜索中使用这些列,所以我必须在where子句中使用它们,所以在回答这个问题时,这一点也很重要如果您需要查找这些字段,我将使用dat

我必须在表中存储年份和月份,下个月还有两列主题和主题详细信息我应该使用什么
数据类型

我是否应该使用
smalldatetime
并通过像
09/01/2011
这样的日期来存储它们

我应该使用两列
varchar
int
来存储单独的年份和日期吗 2011年这样的月份
09

我应该使用一列
varchar
来存储它们并将它们串联起来吗 比如201109

已编辑


我还想补充一点,我必须在搜索中使用这些列,所以我必须在where子句中使用它们,所以在回答这个问题时,这一点也很重要

如果您需要查找这些字段,我将使用dateformat。两个int将使用更多的空间,varchar应该替换为char,因为您的大小是固定的。但正如我所提到的,我会坚持使用日期格式。

通常,我建议使用日期类型,无论您的限制如何,因为它允许您进行日期操作和比较。然后,您可以使用触发器将日期限制为每月的第一天。您需要触发器来确保一个月/年组合不能得到两行

实际上,正如不信者Damian_在一篇评论中正确指出的那样,如果您的目的是只允许用户尝试插入月日为1的日期,则不需要触发器。在这种情况下,约束可能就足够了。只有当您希望允许用户尝试插入任何日期,但实际上强制它成为该月的第一天时,才需要触发器

然而,在这种情况下,我很乐意根据您的用例使用两列的年/月设置

通过使用两个整型列,您不需要担心触发器,而且似乎也不需要根据列规范对表内容进行大规模处理

如果您预见到需要处理给定年份(独立于月份)的数据,我不会将它们存储为单个整数类型列。将年份分开将允许一个不同的索引,这可能比获得一系列
YYYYMM
值要快


认真地说,选择一个你认为最容易编码的(并且满足功能需求)。然后,如果且仅当您发现性能问题时,请查看模式重新组织。数据库不会被设置并忘记一些事情,您应该不断地监控它们是否存在问题,如果有必要,还应该更改一些事情。

我建议为月份和年份设置两个单独的列:

Month TINYINT
Year INT

您正在使用什么类型的数据库?SQL server。。。如果标记正确?你需要触发器吗?检查和唯一约束有什么问题?因为约束就是约束。换句话说,它们阻止插入或更新内容。如果这是你想要的行为,那没关系,但是如果你想允许任何日期被使用,并且只是强制它回到月的第一天,你需要触发器。我将更新答案,以明确这一点。