数据库生日字段的设计问题

netDust_cv 2008-03-17 09:22:30
这个生日字段需要实现查询:

1、今日生日的会员。即:判断月与日相等,年份可以不同。
2、对生日进行查询,可查询月与日或年月日都相等。
3、需要两个字段,阳历与阴历。

会员有几百万。所以需要考虑到性能问题。应该使用什么类型的字段能够快速地查询呢?
...全文
291 点赞 收藏 12
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
netDust_cv 2008-03-17
刚测试了一下,300W的数据量,查询一次需要3秒。而这个操作是经常要做的。如果这样速度的话,可能会使服务器崩溃啊。

会员会自主地查询与他们同一天生日的会员。
回复
netDust_cv 2008-03-17
另外还有个问题就是有些会员不填写生日资料的。
回复
netDust_cv 2008-03-17
[Quote=引用 6 楼 JL99000 的回复:]
我帮他回答吧
速度完全没有问题
如果觉得慢加个索引在生日列上

另外,刚才确认了一下,sql server没有提供自带的阴历阳历之间的转换


[/Quote]

你所指的速度完全没有问题是哪个方法呢?是1楼提到的datetime方法,还是char方法?
阴阳历转换我通过C#来写。
回复
wzy_love_sly 2008-03-17
加索引因该不慢
回复
wzy_love_sly 2008-03-17
阴历阳历之间的转换不好写 呵
回复
kelph 2008-03-17
可以写个转阴历的函数
回复
JL99000 2008-03-17
我帮他回答吧
速度完全没有问题
如果觉得慢加个索引在生日列上

另外,刚才确认了一下,sql server没有提供自带的阴历阳历之间的转换

回复
netDust_cv 2008-03-17
嗯。是这样的。阴历我只需要做个记录就可以了。不需要通过阴历查询。

我看到有用char字段来设计的,不知道通过char字段的link '%月-日' 这种查询的速度如何?与三个字段相比哪个会快一些?
回复
JL99000 2008-03-17
首先,完全可以用datetime的类型来实现阳历查询
其次,所谓的阴历好象是不能用sql server中针对datetime的各个函数,所以我建议用三个字段
回复
netDust_cv 2008-03-17
谢谢大家的回答,回1楼,不知道这样的查询在几百万的会员中查询的速度会如何?
回复
lhsxsh 2008-03-17
请把年、月、日分别用三个字段
类型用 smallint
回复
wzy_love_sly 2008-03-17
--测试数据
DECLARE @t TABLE(ID int,Name varchar(10),Birthday datetime)
INSERT @t SELECT 1,'aa','1999-01-01'
UNION ALL SELECT 2,'bb','1996-02-29'
UNION ALL SELECT 3,'bb','1934-03-01'
UNION ALL SELECT 4,'bb','1966-04-01'
UNION ALL SELECT 5,'bb','1997-05-01'
UNION ALL SELECT 6,'bb','1922-11-21'
UNION ALL SELECT 7,'bb','1989-12-11'

DECLARE @dt1 datetime,@dt2 datetime

--查询 2003-12-05 至 2004-02-28 生日的记录
SELECT @dt1='2003-12-05',@dt2='2004-02-28'
SELECT * FROM @t
WHERE DATEADD(Year,DATEDIFF(Year,Birthday,@dt1),Birthday)
BETWEEN @dt1 AND @dt2
OR DATEADD(Year,DATEDIFF(Year,Birthday,@dt2),Birthday)
BETWEEN @dt1 AND @dt2
/*--结果
ID Name Birthday
---------------- ---------------- --------------------------
1 aa 1999-01-01 00:00:00.000
7 bb 1989-12-11 00:00:00.000
--*/

--查询 2003-12-05 至 2006-02-28 生日的记录
SET @dt2='2006-02-28'
SELECT * FROM @t
WHERE DATEADD(Year,DATEDIFF(Year,Birthday,@dt1),Birthday)
BETWEEN @dt1 AND @dt2
OR DATEADD(Year,DATEDIFF(Year,Birthday,@dt2),Birthday)
BETWEEN @dt1 AND @dt2
/*--查询结果
ID Name Birthday
---------------- ----------------- --------------------------
1 aa 1999-01-01 00:00:00.000
2 bb 1996-02-29 00:00:00.000
7 bb 1989-12-11 00:00:00.000
--*/

回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-03-17 09:22
社区公告
暂无公告