每月生日SQL查询

时间:2020-03-06 14:31:16  来源:igfitidea点击:

如何在SQL中检索给定月份的所有客户生日?那MySQL呢?
我正在考虑将以下内容与SQL Server一起使用。

select c.name   
from cust c
where  datename(m,c.birthdate) = datename(m,@suppliedDate)
order by c.name

解决方案

就个人而言,我会使用DATEPART而不是DATENAME,因为DATENAME可以根据语言环境进行解释。

别忘了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))
)

如果我们希望客户列表会很大,那么我实际上很想添加一个生日月份列。到目前为止,当我们将data列传递给函数并进行比较时,我所看到的查询(包括示例)将需要全表扫描。如果该表有任何大小,这可能会花费相当长的时间,因为没有索引可以提供帮助。

因此,我将添加birthmonthmonth列(索引),然后执行(使用可能的MySQLism):

SELECT name
FROM  cust
WHERE birthmonth = MONTH(NOW())
ORDER BY name;

当然,使用触发器或者客户代码设置生日月份列应该很容易。

如果我们要求给定月份的所有生日,则应提供月份而不是日期:

SELECT c.name
FROM   cust c
WHERE  datepart(m,c.birthdate) = @SuppliedMonth