Sql 如何将smalldatetime分解为年、月、日索引?

Sql 如何将smalldatetime分解为年、月、日索引?,sql,sql-server,Sql,Sql Server,我正在使用SQLServer2008 我的数据库中有一些日期,我“认为”我想把它们分解成更小的部分。日期是生日和死亡日。我希望能够像查询10月、5月12日或1945年出生的人那样输出它们 有人告诉我,一种典型的方法是把一个日期分成几个小部分,然后把每个日期都放在自己的列中,如下所示: 2001-03-12 00:00:00 // EventDate column create table DateTest ( SomeDate datetime not null, SomeYe

我正在使用SQLServer2008

我的数据库中有一些日期,我“认为”我想把它们分解成更小的部分。日期是生日和死亡日。我希望能够像查询10月、5月12日或1945年出生的人那样输出它们

有人告诉我,一种典型的方法是把一个日期分成几个小部分,然后把每个日期都放在自己的列中,如下所示:

2001-03-12 00:00:00 // EventDate column
create table DateTest
(
    SomeDate datetime not null,
    SomeYear as datepart(yy, somedate) persisted,
    SomeMonth as datepart(mm, somedate) persisted,
    SomeDay as datepart(dd, somedate) persisted
)
添加以下列:

2001 // EventYear column
03 // EventMonth column
12 // EventDay column
首先,这是一个好的方法吗?如果是这样,第二,我是否可以让SQL Server自动将日期部分打断,并将其放入自己的列中


非常感谢您的想法和解决方案。

我建议您将其保留为日期列,然后在查询中使用以过滤结果

Select * from TABLEX
where DatePart(YEAR,EventDate) = 1945

听起来业务需求并不是很稳定。你为什么要把约会的不同部分分开?如果你不需要,我也不会

但是,如果您确实觉得有必要这样做,那么我将使用持久化的计算列。插入会有一些开销,但因为现有数据不会有任何更新(您的出生日期和死亡日期不会更改),所以您不会在选择上看到任何性能开销

大概是这样的:

2001-03-12 00:00:00 // EventDate column
create table DateTest
(
    SomeDate datetime not null,
    SomeYear as datepart(yy, somedate) persisted,
    SomeMonth as datepart(mm, somedate) persisted,
    SomeDay as datepart(dd, somedate) persisted
)
这就是我要做的

我有一张“自由日期”的桌子。它有一个日期作为主键

到目前为止,它还有其他列和其他信息。例如,月日、月底前一天、一年中的一周等

通过将此日期表与日期关联,我可以: *获取所有日期的列表(例如,按日期将每个人的销售额分组将不会有零销售额的条目,这种方式可以有) *做一些有趣的事情,比如每年第23周的所有日期,这通常是很难得到的


这是我让存储过程每天维护的许多这样的表的一部分(-3年,+5年)。

当查询是5月12日时,这将如何执行?这是处理datetime列操作的正确方法。除非您谈论的是一个拥有数百万条记录的数据库,否则将日期复制到多个列是没有意义的,而且性能非常重要。这个功能成本低,性能应该很好。我当然不会有数百万次约会,可能只有几千次。我想做这件事,就好像有一百万次约会一样。我更愿意编写一个像select*from DateTable(其中Year=1945)这样的查询,而不是在每个查询中都使用日期部分。使用日期部分的主要好处是,您不需要在每次需要对数据进行不同切片时都考虑创建一个新列。例如,如果您决定要知道星期六发生的所有事件,则无需为星期几创建另一列,只需使用datepart weekday。主要缺点是每个查询都是表扫描,可能除了按该顺序包括年、月、日等的查询外(我不知道DatePart是否可搜索,但部分查询肯定不可搜索。)该表中有多少行数据?最多有10000行分布在四到六个表中。不过,我真的很想学习“正确”的方法。我不想用任何旧方法来完成它。我已经可以做四到五个“错误”了方法。我想知道专家会怎么做。你说的4-6个表是什么意思?我会有四到五个带日期的表。每个表可能有2000行。我看不出有任何理由指示Erik拆分每个datetime列以查询2000条记录。计算列+1,但别忘了添加索引,否则你将不得不不管怎么说,还是要用列扫描表。而且计算出的年列并不是必需的。你可以直接用日期列。有趣的解决方案。这高于我的经验水平,但我会研究它并记住它。谢谢!你是说一个
日历
表,其他每个表都有
日期
字段c引用它作为
外键
?因此,没有其他表需要持久化的索引视图?如果需要,请从我这里获得+1。是的,没错。它还属于我维护的库项目-我有时会在这里添加新表。尤其是连接功能有时非常好(因为它调用我来保存所有日期的列表,而不仅仅是包含数据的日期)是的,类似的问题不时出现,所以,“找出所有没有接受订单的日期”。TomTom,这是一个有趣的解决方案,但对我来说太多了。不过我很感谢你向我介绍这个想法。