You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 19:52:55