我想在即将到来的月份显示生日列表。
生日存储在birthday
列中。我该如何显示?
答案 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)