选择即将到来的生日

时间:2012-06-11 06:54:00

标签: c# sql sql-server sql-server-2005

我想在即将到来的月份显示生日列表。

生日存储在birthday列中。我该如何显示?

5 个答案:

答案 0 :(得分:3)

我首选的解决方案是拥有一个可以索引的额外列; next_birthday

作为一夜之间的过程,您需要更新该列,以确保价值始终在将来。

这允许查询如下:

SELECT
  myfriends.*
FROM
  user               AS myself
INNER JOIN
  user               AS myfriends
    ON  myfriends.next_birthday >=                   myself.next_birthday
    AND myfriends.next_birthday <  DATEADD(MONTH, 1, myself.next_birthday)

这会保留日期时间字段的year部分,因此可以很好地应对going around the corner
- 如果我的下一个生日是2012-12-15 - 我想在1月上旬的12月下半月生日那天过生日 - 仅使用日期和月份的解决方案(而非年份)与此

进行斗争

该字段可以编入索引,因此解决方案不会要求扫描表中的每条记录。

但是,它确实可以运行该维护作业来更新字段。如果作业尚未执行,则部分数据将过时。

你还需要小心29th Feb生日那天的人 - 你不能只在生日那天加一年; 29th Feb + 1 year移至28th feb,无论您添加多少年,都不会回到29th Feb。但那不是太难......

UPDATE
  user
SET
  next_birthday = DATEADD(YEAR, DATEDIFF(YEAR, birthday, GETDATE()) + 1, birthday)
WHERE
  next_birthday < GETDATE()

所有这些非常范围狭窄。它针对一个非常特殊的需求引入了新的列和新的维护工作。然后应该问这个问题;这些成本是否优于替代查询(通常需要表扫描等)

答案 1 :(得分:2)

Select birthdaycolumn from yourtable where MONTH(birthdaycolumn) = MONTH(GETDATE()) 

试试这个会起作用

答案 2 :(得分:2)

尝试这个

Select * 
from yourDataTable
where MONTH(birthdaycolumn) = (MONTH(GETDATE() + 1)) 

答案 3 :(得分:1)

尝试这样的事情:

SELECT BirthDay 
FROM TableName
WHERE DATEPART(m, BirthDay) = UpcomingMonth 

在此SQL查询中使用UpcomingMonth作为参数。希望这会有所帮助。

答案 4 :(得分:0)

解决了这个问题。

select * from Employee

where convert(nvarchar,convert(datetime,convert(nvarchar,YEAR(GETDATE()))+'.'+convert(nvarchar,MONTH(Birthday))+'.'+convert(nvarchar,DAY(Birthday))),102) between convert(nvarchar,getdate(),102) and convert(nvarchar,DATEADD(D,14 ,GETDATE()),102)