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

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

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

会员有几百万。所以需要考虑到性能问题。应该使用什么类型的字段能够快速地查询呢?
...全文
635 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
--*/

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧