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

使用period表数据作为trans与master关联查询的WHERE条件报错求助

解决MySQL 1064语法错误:修正跨表条件查询语句

看起来你遇到了MySQL的语法解析错误(错误码1064),问题出在WHERE子句里的BETWEEN条件写法上——SQL里BETWEEN需要直接跟两个明确的边界值,不能像你那样嵌套IN(SELECT ...)子查询。咱们一步步来修正这个问题:

错误原因分析

你的原语句中这部分写法不符合SQL规范:

pdate BETWEEN STRDate IN(SELECT STRDate FROM period) AND ENDDate IN (SELECT ENDDate FROM...

IN子查询会返回多个结果集,但BETWEEN要求左右两边都是单个值,MySQL无法解析这种混合写法,所以抛出1064错误。

修正后的查询语句

假设period表中存储的是你需要的时间段的起始(STRDate)和结束(ENDDate),分两种常见情况处理:

情况1:period表只有一条时间段记录

如果period表里只存了一组全局的起止日期,直接用标量子查询获取单个值即可:

SELECT 
    b.projname AS companies,
    SUM(a.otreg_h) AS hours,
    SUM(a.otreg_m) AS minutes 
FROM trans AS a 
JOIN MASTER AS b ON a.empno = b.empno 
WHERE 
    a.otreg_h != 0 
    AND a.otreg_m != 0 
    AND a.pdate BETWEEN (SELECT STRDate FROM period LIMIT 1) AND (SELECT ENDDate FROM period LIMIT 1)
GROUP BY b.projname; -- 补充GROUP BY,聚合查询必须对非聚合字段分组,否则MySQL严格模式下会报错

情况2:period表有多条记录,需要关联筛选

如果period表有多个时间段(比如每个项目对应一个时间段),你需要先关联period表再筛选:

SELECT 
    b.projname AS companies,
    SUM(a.otreg_h) AS hours,
    SUM(a.otreg_m) AS minutes 
FROM trans AS a 
JOIN MASTER AS b ON a.empno = b.empno
JOIN period AS p ON b.projname = p.projname -- 假设按项目关联period,可根据实际业务调整关联字段
WHERE 
    a.otreg_h != 0 
    AND a.otreg_m != 0 
    AND a.pdate BETWEEN p.STRDate AND p.ENDDate
GROUP BY b.projname;

额外优化建议

  • 如果你的需求是只要有加班时长就统计(不是必须小时和分钟都不为0),可以把otreg_h != 0 AND otreg_m != 0改成(otreg_h > 0 OR otreg_m > 0),避免漏掉只有小时或只有分钟的加班记录。
  • 确保pdate、STRDate、ENDDate字段的类型一致(都是DATE/DATETIME类型),避免隐式转换导致的性能问题或筛选错误。

内容的提问来源于stack exchange,提问作者Keith Yung

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:18:39