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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:01:06