如何在SQL中忽略年份,筛选6月10日至12月31日的入职员工并更新字段
嘿,这个问题我之前也帮不少开发者踩过坑——确实,当你只想按月和日筛选日期,完全忽略年份的时候,BETWEEN因为必须依赖完整的带年份的日期,就显得不太顺手了。不过别担心,有几种通用的思路和具体实现,适配不同的数据库,我给你捋清楚:
按日和月筛选日期的通用解决方案
核心思路是从日期字段中提取出「月-日」的独立信息,再和目标区间的「月-日」进行比较,彻底摆脱年份的干扰。下面是主流数据库的具体实现:
1. MySQL/MariaDB 场景
可以用DATE_FORMAT直接转成标准的月日字符串,或者用DAYOFYEAR按一年中的天数来判断:
-- 方法1:转成「MM-DD」字符串比较(最稳妥,适配闰年) SELECT * FROM employees WHERE DATE_FORMAT(hire_date, '%m-%d') BETWEEN '06-10' AND '12-31'; -- 方法2:按一年中的天数筛选(注意:闰年2月29日会影响结果) SELECT * FROM employees WHERE DAYOFYEAR(hire_date) BETWEEN 162 AND 365;
⚠️ 小提示:如果你的数据里有闰年入职的员工,优先用第一种方法,避免DAYOFYEAR的偏差。
2. PostgreSQL 场景
用TO_CHAR转字符串,或者拆分月和日分别判断(后者更利于索引生效):
-- 方法1:字符串转换法 SELECT * FROM employees WHERE TO_CHAR(hire_date, 'MM-DD') BETWEEN '06-10' AND '12-31'; -- 方法2:拆分月日精准判断(大表数据推荐用这个) SELECT * FROM employees WHERE (EXTRACT(MONTH FROM hire_date) > 6) OR (EXTRACT(MONTH FROM hire_date) = 6 AND EXTRACT(DAY FROM hire_date) >= 10);
3. SQL Server 场景
用FORMAT转字符串,或者DATEPART拆分字段:
-- 方法1:字符串转换法 SELECT * FROM employees WHERE FORMAT(hire_date, 'MM-dd') BETWEEN '06-10' AND '12-31'; -- 方法2:拆分月日判断 SELECT * FROM employees WHERE (DATEPART(MONTH, hire_date) > 6) OR (DATEPART(MONTH, hire_date) = 6 AND DATEPART(DAY, hire_date) >= 10);
4. Oracle 场景
和PostgreSQL逻辑类似,用TO_CHAR或EXTRACT实现:
-- 方法1:字符串转换法 SELECT * FROM employees WHERE TO_CHAR(hire_date, 'MM-DD') BETWEEN '06-10' AND '12-31'; -- 方法2:拆分月日判断 SELECT * FROM employees WHERE (EXTRACT(MONTH FROM hire_date) > 6) OR (EXTRACT(MONTH FROM hire_date) = 6 AND EXTRACT(DAY FROM hire_date) >= 10);
通用注意事项
- 如果日期字段存在
NULL值,记得加上hire_date IS NOT NULL,避免出现意外结果。 - 如果需要处理跨年度的区间(比如11月1日到次年2月28日),只要把条件拆成「大于等于11-01」或「小于等于02-28」即可。
- 性能优化:大表数据下,拆分月日的方法比字符串转换更高效,因为字符串转换可能导致索引失效;如果需要频繁做这类查询,可以考虑给「月日组合」创建函数索引。
内容的提问来源于stack exchange,提问作者Kartikeya
相关产品推荐
相关产品推荐

