如何在SQL中检索给定月份的所有客户的生日? MySQL怎么样? 我正在考虑将以下内容与SQL服务器一起使用。
select c.name
from cust c
where datename(m,c.birthdate) = datename(m,@suppliedDate)
order by c.name
答案 0 :(得分:5)
不要忘记2月29日...
SELECT c.name
FROM cust c
WHERE (
MONTH(c.birthdate) = MONTH(@suppliedDate)
AND DAY(c.birthdate) = DAY(@suppliedDate)
) OR (
MONTH(c.birthdate) = 2 AND DAY(c.birthdate) = 29
AND MONTH(@suppliedDate) = 3 AND DAY(@suppliedDate) = 1
AND (YEAR(@suppliedDate) % 4 = 0) AND ((YEAR(@suppliedDate) % 100 != 0) OR (YEAR(@suppliedDate) % 400 = 0))
)
答案 1 :(得分:2)
我个人会使用DATEPART而不是DATENAME,因为DATENAME可以根据语言环境进行解释。
答案 2 :(得分:2)
如果您要求在给定的月中生日,那么您应该提供月,而不是日期:
SELECT c.name
FROM cust c
WHERE datepart(m,c.birthdate) = @SuppliedMonth
答案 3 :(得分:1)
如果您希望客户列表变得非常大,我实际上很想添加一个出生月列。到目前为止,我所看到的查询(包括示例)将需要全表扫描,因为您将数据列传递给函数并进行比较。如果该表具有任何大小,这可能需要相当长的时间,因为没有索引能够提供帮助。
所以,我会添加birthmonth列(索引)并且只是(可能有MySQLisms):
SELECT name
FROM cust
WHERE birthmonth = MONTH(NOW())
ORDER BY name;
当然,使用触发器或客户端代码设置birthmonth列应该很容易。
答案 4 :(得分:0)
SELECT * FROM tbl_Employee WHERE DATEADD( Year, DATEPART( Year, GETDATE()) - DATEPART( Year, DOB), DOB) BETWEEN CONVERT( DATE, GETDATE()) AND CONVERT( DATE, GETDATE() + 30)
这可以用来按天获取即将到来的生日