如何编写无年份限制的SQL查询筛选天秤座对应出生日期记录
原SQL失效原因
BETWEEN运算符仅用于匹配连续的完整日期值,不能和LIKE语法的%通配符混用,因此无法直接按日月后缀过滤不限年份的日期范围。
实现方案
通用兼容写法(所有数据库均可使用)
直接拆分月份和日期做判断,不需要依赖数据库专属函数,逻辑最清晰,兼容性最强:
SELECT * FROM persons WHERE (MONTH(BirthDate) = 9 AND DAY(BirthDate) >= 23) OR (MONTH(BirthDate) = 10 AND DAY(BirthDate) <= 22);
如果你的数据库不支持MONTH()、DAY()函数,也可以利用BirthDate固定为YYYY-MM-DD格式的特征,截取第6位开始的5位字符(对应MM-DD格式)做匹配:
SELECT * FROM persons WHERE SUBSTRING(BirthDate, 6, 5) BETWEEN '09-23' AND '10-22';
不同数据库专属优化写法
- MySQL:使用
DATE_FORMAT提取月日格式SELECT * FROM persons WHERE DATE_FORMAT(BirthDate, '%m-%d') BETWEEN '09-23' AND '10-22'; - PostgreSQL/Oracle:使用
TO_CHAR提取月日格式-- PostgreSQL SELECT * FROM persons WHERE TO_CHAR(BirthDate, 'MM-DD') BETWEEN '09-23' AND '10-22'; -- Oracle SELECT * FROM persons WHERE TO_CHAR(BirthDate, 'MM-DD') BETWEEN '09-23' AND '10-22'; - SQL Server:使用
FORMAT或者DATEPARTSELECT * FROM persons WHERE FORMAT(BirthDate, 'MM-dd') BETWEEN '09-23' AND '10-22';
注意事项
匹配月日时要统一使用两位数格式,比如9月要写09,避免出现单数字月份匹配失败的问题。
内容的提问来源于stack exchange,提问作者jzuhri
相关产品推荐
相关产品推荐

