我想显示下个月的生日列表。
生日存储在birthday
列中。我怎样才能显示这个?
我首选的解决方案是有一个可以索引的额外列;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()
所有这一切的范围也非常狭窄。它为一个非常特殊的需求引入了一个新的色谱柱和一个新的维护工作。然后应该问这个问题;这些成本比替代查询(通常需要表扫描等)更可取吗?
Select birthdaycolumn from yourtable where MONTH(birthdaycolumn) = MONTH(GETDATE())
试试这个会起作用
试试这个
Select *
from yourDataTable
where MONTH(birthdaycolumn) = (MONTH(GETDATE() + 1))
尝试这样的事情:
SELECT BirthDay
FROM TableName
WHERE DATEPART(m, BirthDay) = UpcomingMonth
在此 SQL 查询中使用 UpcomingMonth 作为参数。希望这可以帮助。
解决了那个问题。
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)