如何在SQL中仅查询日期的dd/MM部分(生日查询场景)
嘿,这个需求太常见了——做生日筛选的时候总需要忽略年份只看日和月对吧!你的DOB字段是YYYY-MM-dd 00:00:00.000这种datetime格式,不同的SQL数据库处理方式略有不同,我给你分情况整理了最实用的方法:
提取日期的dd/MM部分并匹配生日
核心思路就是剥离年份,只保留日和月信息,再进行匹配。下面针对主流SQL数据库给出具体实现:
1. SQL Server(你的DOB格式看起来是SQL Server的datetime类型)
方法一:用FORMAT函数(简单直观)
如果要查询所有今天过生日的记录:
SELECT * FROM YourTable WHERE FORMAT(DOB, 'dd/MM') = FORMAT(GETDATE(), 'dd/MM');
要是想匹配特定的日/月(比如找元旦生日的人):
SELECT * FROM YourTable WHERE FORMAT(DOB, 'dd/MM') = '01/01';
方法二:用DATEPART拼接(性能更优)
要是你的表数据量不小,FORMAT这类函数可能会让数据库没法用DOB字段上的索引,这时候用DATEPART分别提取日和月的方式性能会好很多:
-- 匹配今天的生日 SELECT * FROM YourTable WHERE DATEPART(DAY, DOB) = DATEPART(DAY, GETDATE()) AND DATEPART(MONTH, DOB) = DATEPART(MONTH, GETDATE()); -- 匹配特定的日和月(比如12月25日) SELECT * FROM YourTable WHERE DATEPART(DAY, DOB) = 25 AND DATEPART(MONTH, DOB) = 12;
2. MySQL
MySQL里用DATE_FORMAT函数就能轻松搞定:
-- 匹配今天的生日 SELECT * FROM YourTable WHERE DATE_FORMAT(DOB, '%d/%m') = DATE_FORMAT(NOW(), '%d/%m'); -- 匹配特定dd/MM SELECT * FROM YourTable WHERE DATE_FORMAT(DOB, '%d/%m') = '25/12';
追求性能的话,也可以用DAY()和MONTH()函数:
SELECT * FROM YourTable WHERE DAY(DOB) = DAY(NOW()) AND MONTH(DOB) = MONTH(NOW());
3. PostgreSQL
PostgreSQL用TO_CHAR函数来格式化日期:
-- 匹配今天的生日 SELECT * FROM YourTable WHERE TO_CHAR(DOB, 'DD/MM') = TO_CHAR(CURRENT_DATE, 'DD/MM'); -- 匹配特定dd/MM SELECT * FROM YourTable WHERE TO_CHAR(DOB, 'DD/MM') = '01/01';
同样,提取日和月的方式更适合大数据量场景:
SELECT * FROM YourTable WHERE EXTRACT(DAY FROM DOB) = EXTRACT(DAY FROM CURRENT_DATE) AND EXTRACT(MONTH FROM DOB) = EXTRACT(MONTH FROM CURRENT_DATE);
小提醒
- 如果你的DOB字段是字符串类型(虽然非常不推荐,日期数据一定要用datetime类型存储),可以直接截取最后5位(比如
RIGHT(DOB,5))来得到dd/MM,但强烈建议先把字段转成日期类型再操作,避免格式混乱导致的错误。 - 数据量大的时候,优先用提取日、月的方式,别用格式化函数——后者会让数据库跳过索引,查询速度会慢很多。
内容的提问来源于stack exchange,提问作者maximdj
相关产品推荐
相关产品推荐

