SQLite中如何通过年月筛选指定时间段内的员工入职记录?
解决仅通过年月查询日期区间的问题
问题分析
你之前的查询逻辑存在漏洞:(strftime('%Y', dateA) BETWEEN '1980' AND '1985') AND (strftime('%m', dateA) BETWEEN '01' AND '06') 会错误过滤掉1980年7-12月、1981-1984年全年的员工——因为这些年份里月份不在1-6区间的记录都会被排除,但实际上1980年全年、1981-1984年全年、1985年1-6月都应该被包含在你的目标区间内。
正确的查询写法
因为你只有年月参数,最稳妥的方式是把年月参数转换为区间的边界日期,再用日期比较:
方法1:通用SQL写法(适配多数数据库)
假设你的起始年月参数是 @start_year_month(比如'1980-01'),结束年月参数是 @end_year_month(比如'1985-06'):
SELECT * FROM 你的表名 WHERE 入职日期 >= DATE(@start_year_month || '-01') AND 入职日期 < DATE(@end_year_month || '-01', '+1 month');
- 逻辑说明:
@start_year_month || '-01'把起始年月拼接成该月第一天(例如'1980-01'→'1980-01-01')DATE(@end_year_month || '-01', '+1 month')把结束年月转换为下一个月的第一天(例如'1985-06'→'1985-07-01')- 用
<而非<=,可以避免处理不同月份最后一天的天数差异(比如2月的28/29天、31天的大月等)
方法2:SQLite专属简化写法
如果你使用的是SQLite,也可以直接比较年月字符串拼接结果:
SELECT * FROM 你的表名 WHERE strftime('%Y-%m', 入职日期) BETWEEN @start_year_month AND @end_year_month;
- 逻辑说明:
strftime('%Y-%m', 入职日期)会返回类似'1980-01'的字符串,直接与输入的年月参数做BETWEEN比较是有效的,因为字符串按年、月顺序排序,不会出现逻辑错误。
原写法错误原因
你的条件相当于要求年份在1980-1985之间,且月份必须在1-6之间,这会把1980年7-12月、1981-1984年所有月份的员工都排除,显然不符合“1980年1月至1985年6月”的需求。
内容的提问来源于stack exchange,提问作者Akhil RJ
相关产品推荐
相关产品推荐

