-4

我想显示下个月的生日列表。

生日存储在birthday列中。我怎样才能显示这个?

4

5 回答 5

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应对: - 如果我的下一个生日是 - 我想要 12 月下半月的生日1 月上半月的生日 - 仅使用日期和月份的解决方案(不年)与此斗争 going around the corner
2012-12-15

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

但是,它确实假设您可以运行该维护作业来更新该字段。在作业未执行的情况下,部分数据将过期。

你还需要小心那些过生日的人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()

所有这一切的范围也非常狭窄。它为一个非常特殊的需求引入了一个新的色谱柱和一个新的维护工作。然后应该问这个问题;这些成本比替代查询(通常需要表扫描等)更可取吗?

于 2012-06-11T08:50:01.373 回答
2
Select birthdaycolumn from yourtable where MONTH(birthdaycolumn) = MONTH(GETDATE()) 

试试这个会起作用

于 2012-06-11T07:03:47.857 回答
2

试试这个

Select * 
from yourDataTable
where MONTH(birthdaycolumn) = (MONTH(GETDATE() + 1)) 
于 2012-06-11T07:32:21.693 回答
1

尝试这样的事情:

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

在此 SQL 查询中使用 UpcomingMonth 作为参数。希望这可以帮助。

于 2012-06-11T07:00:26.657 回答
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)
于 2012-06-19T08:48:59.527 回答