每月生日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