SQL查询:仅比较datetime的年月,筛选符合条件的id
SQL筛选方案
可以通过分组聚合或者自连接的方式,提取val字段的年月部分进行对比,筛选出符合要求的id。以下是两种常见实现方式:
方式一:分组聚合
SELECT t.id FROM tval t -- 关联目标id列表 JOIN (SELECT id FROM id WHERE sid = 2403) ids ON t.id = ids.id WHERE t.fid IN (3771, 3782) GROUP BY t.id HAVING -- 提取两个fid对应val的年月并比较差异 DATE_FORMAT(MAX(CASE WHEN t.fid = 3771 THEN t.val END), '%Y-%m') != DATE_FORMAT(MAX(CASE WHEN t.fid = 3782 THEN t.val END), '%Y-%m')
方式二:自连接
SELECT DISTINCT t1.id FROM tval t1 JOIN tval t2 ON t1.id = t2.id -- 关联目标id列表 JOIN (SELECT id FROM id WHERE sid = 2403) ids ON t1.id = ids.id WHERE t1.fid = 3771 AND t2.fid = 3782 -- 直接对比两个val的年月部分 AND DATE_FORMAT(t1.val, '%Y-%m') != DATE_FORMAT(t2.val, '%Y-%m')
适配不同数据库的说明
上述代码基于MySQL语法,若使用其他数据库,需调整日期格式化函数:
- Oracle:替换
DATE_FORMAT(val, '%Y-%m')为TO_CHAR(val, 'YYYY-MM') - SQL Server:替换为
CONVERT(varchar(7), val, 120)或FORMAT(val, 'yyyy-MM') - 若
val是字符串格式,需先转换为日期类型再提取年月。
内容的提问来源于stack exchange,提问作者user21641220
相关产品推荐
相关产品推荐

