如何编写SQL查询获取指定生日区间的客户(日期格式dd.mm.yyyy)
按生日月日区间筛选客户的SQL解决方案
由于你的date字段存储为dd.mm.yyyy格式的字符串,直接用BETWEEN比较完整日期会受年份干扰。核心解决思路是剥离年份,仅提取月日部分进行匹配,以下分场景给出具体SQL语句:
场景1:生日区间不跨年度(如03.15 ~ 06.20)
以MySQL为例,先将字符串日期转为标准日期类型,再提取mmdd格式的月日字符串进行区间比较:
SELECT * FROM wp_clients WHERE DATE_FORMAT(STR_TO_DATE(`date`, '%d.%m.%Y'), '%m%d') BETWEEN '0315' AND '0620';
如果使用PostgreSQL,语法类似:
SELECT * FROM wp_clients WHERE TO_CHAR(TO_DATE(date, 'DD.MM.YYYY'), 'MMDD') BETWEEN '0315' AND '0620';
场景2:生日区间跨年度(如12.20 ~ 01.10)
此时mmdd字符串的起始值大于结束值,不能直接用BETWEEN,需拆分为两个条件的逻辑或:
MySQL版本:
SELECT * FROM wp_clients WHERE DATE_FORMAT(STR_TO_DATE(`date`, '%d.%m.%Y'), '%m%d') >= '1220' OR DATE_FORMAT(STR_TO_DATE(`date`, '%d.%m.%Y'), '%m%d') <= '0110';
PostgreSQL版本:
SELECT * FROM wp_clients WHERE TO_CHAR(TO_DATE(date, 'DD.MM.YYYY'), 'MMDD') >= '1220' OR TO_CHAR(TO_DATE(date, 'DD.MM.YYYY'), 'MMDD') <= '0110';
特殊处理:闰年2月29日的生日
如果有客户生日是2月29日,非闰年时需要额外处理(比如匹配到2月28日),以MySQL为例:
SELECT * FROM wp_clients WHERE -- 非闰年时,将2月29日生日视为2月28日 (DATE_FORMAT(STR_TO_DATE(`date`, '%d.%m.%Y'), '%m%d') = '0229' AND DATE_FORMAT(CURDATE(), '%m%d') = '0228') OR DATE_FORMAT(STR_TO_DATE(`date`, '%d.%m.%Y'), '%m%d') BETWEEN '0220' AND '0305';
内容的提问来源于stack exchange,提问作者Black Cat
相关产品推荐
相关产品推荐

