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

如何在Microsoft Access查询中比较数值?筛选时长<6小时报错求助

在Microsoft Access中筛选时长小于6小时记录的报错解决方法

问题背景

原查询可正常统计2022-07-01的签到签退时长,但添加时长筛选条件后触发报错:

"The SELECT statement includes a reserved word or an argument name that is misspelled or missing, or the punctuation is incorrect".

原正常查询语句:

SELECT  (B.Name),
        FORMAT(C.CHECKTIME,'hh') - FORMAT(A.CHECKTIME,'hh') AS TOTAL 
FROM    ( [CHECKINOUT] AS A INNER JOIN [USERINFO] AS B ON A.USERID=B.USERID ) 
                            INNER JOIN [CHECKINOUT] AS C ON B.USERID=C.USERID 
WHERE   A.CHECKTYPE='I' AND C.CHECKTYPE='O' AND 
        FORMAT(A.CHECKTIME,'yyyy-mm-dd') LIKE '%2022-07-01%' AND 
        FORMAT(C.CHECKTIME,'yyyy-mm-dd') LIKE '%2022-07-01%'

错误修改后的语句(问题核心:将筛选条件TOTAL<6错误嵌入SELECT字段别名定义):

Select  (B.Name),FORMAT(C.CHECKTIME,'hh') - FORMAT(A.CHECKTIME,'hh') AS TOTAL<6  
from(
        [CHECKINOUT] AS A
        INNER JOIN [USERINFO] AS B ON A.USERID=B.USERID  )
        INNER JOIN [CHECKINOUT] AS C ON B.USERID=C.USERID 
where A.CHECKTYPE='I' and C.CHECKTYPE='O' AND FORMAT(A.CHECKTIME,'yyyy-mm-dd') LIKE '%2022-07-01%' AND FORMAT(C.CHECKTIME,'yyyy-mm-dd') LIKE '%2022-07-01%'

报错原因

你错误地将筛选逻辑TOTAL<6写在了SELECT子句的字段别名声明中,违反SQL语法规则——SELECT子句仅用于定义字段或计算列的别名,不能直接放置筛选条件。

正确解决方案

提供两种可行写法:

方法1:在WHERE子句中直接计算时长并筛选

SELECT  B.Name,
        FORMAT(C.CHECKTIME,'hh') - FORMAT(A.CHECKTIME,'hh') AS TOTAL 
FROM    ( [CHECKINOUT] AS A INNER JOIN [USERINFO] AS B ON A.USERID=B.USERID ) 
                            INNER JOIN [CHECKINOUT] AS C ON B.USERID=C.USERID 
WHERE   A.CHECKTYPE='I' AND C.CHECKTYPE='O' 
        AND FORMAT(A.CHECKTIME,'yyyy-mm-dd') = '2022-07-01'
        AND FORMAT(C.CHECKTIME,'yyyy-mm-dd') = '2022-07-01'
        AND (FORMAT(C.CHECKTIME,'hh') - FORMAT(A.CHECKTIME,'hh')) < 6

注:日期匹配用=比LIKE更高效准确,因为此处日期为固定值,无需模糊匹配。

方法2:用子查询先计算时长,再筛选

如果需要复用TOTAL字段,子查询的写法更清晰:

SELECT  Name, TOTAL
FROM (
    SELECT  B.Name,
            FORMAT(C.CHECKTIME,'hh') - FORMAT(A.CHECKTIME,'hh') AS TOTAL 
    FROM    ( [CHECKINOUT] AS A INNER JOIN [USERINFO] AS B ON A.USERID=B.USERID ) 
                                INNER JOIN [CHECKINOUT] AS C ON B.USERID=C.USERID 
    WHERE   A.CHECKTYPE='I' AND C.CHECKTYPE='O' 
            AND FORMAT(A.CHECKTIME,'yyyy-mm-dd') = '2022-07-01'
            AND FORMAT(C.CHECKTIME,'yyyy-mm-dd') = '2022-07-01'
) AS Temp
WHERE TOTAL < 6

额外优化提示

用FORMAT提取小时计算时长存在局限性,若出现跨天签退(当天签到次日签退)会得到负数结果。建议改用DateDiff函数计算更准确的时长:

DateDiff("h", A.CHECKTIME, C.CHECKTIME) AS TOTAL

替换原有的FORMAT计算逻辑后,筛选条件可写为DateDiff("h", A.CHECKTIME, C.CHECKTIME) < 6,能正确处理跨天场景。


内容的提问来源于stack exchange,提问作者abed dak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:24:23