SQL查询结果不是我所期望的

SQL查询结果不是我所期望的,sql,ms-access,ms-access-2010,Sql,Ms Access,Ms Access 2010,我正在Access 2010中测试以下SQL查询: SELECT Employees.Corps_ID, Employees.Last_Name, Employees.First_Name, Shifts.Start_Date_Time, Shifts.End_Date_Time, DateDiff('n',Shifts.Start_Date_Time,Shifts.End_Date_Time) AS SubTotalMinutes, Locations.

我正在Access 2010中测试以下SQL查询:

SELECT 
    Employees.Corps_ID, Employees.Last_Name, Employees.First_Name, 
    Shifts.Start_Date_Time, Shifts.End_Date_Time, 
    DateDiff('n',Shifts.Start_Date_Time,Shifts.End_Date_Time) AS SubTotalMinutes, 
    Locations.Location_Name
FROM 
    (Locations 
INNER JOIN 
    Shifts ON Locations.Location_ID = Shifts.Location) 
INNER JOIN 
    (Employees INNER JOIN Employees_Shifts ON Employees.Employee_ID = Employees_Shifts.Employee_ID) ON Shifts.Shift_ID = Employees_Shifts.Shift_ID 
WHERE 
    (((Shifts.Start_Date_Time) Between #2015/09/26# And #2015/10/09#) 
     AND ((Shifts.Schedule_ID) = 1) OR ((Shifts.Schedule_ID) = 2)) 
ORDER BY 
    Employees.Last_Name;
请注意日期范围
介于2015/09/26和2015/10/09之间。那是9月26日。到10月9日。这代表一个支付期。查询运行时没有错误,但是,结果显示10月9日以后的记录。事实上,它们一直持续到月底。我不明白它为什么这么做。有人有解释吗

仅供参考,我认为这可能与条件有关:

((Shifts.Schedule\u ID)=1)或((Shifts.Schedule\u ID)=2))
但是如果我将OR更改为AND,我会得到一个空记录集,这不好。我必须参考这两个时间表,因为每一个时间表都涵盖一个月,并且支付期跨越第一个月的最后一周和下个月的第一周


请告知。

Access查询设计器添加了太多不必要的括号,我认为这些括号在这种情况下会混淆逻辑。下面是db引擎如何处理您的
WHERE
条件

在哪里
(2015/09/26和2015/10/09之间的班次。开始日期和时间以及班次。计划ID=1)
或班次。计划表ID=2
因此,基本上,如果一行的
Start\u Date\u Time
在您的目标日期范围内,并且它的
Schedule\u ID=1
,则该行将包含在查询结果集中。或者,如果一行的
Schedule\u ID=2
,则该行将被包括在内,而不考虑其
开始日期\u时间

我想你真的想要这个

        Shifts.Start_Date_Time Between #2015/09/26# And #2015/10/09#
    AND (Shifts.Schedule_ID=1 OR Shifts.Schedule_ID=2)
但对我来说,在
列表中为
计划ID
值使用
更为清晰

        Shifts.Start_Date_Time Between #2015/09/26# And #2015/10/09#
    AND Shifts.Schedule_ID IN (1,2)

您的情况如下:

WHERE (((Shifts.Start_Date_Time) Between #2015/09/26# And #2015/10/09#) AND ((Shifts.Schedule_ID)=1) OR ((Shifts.Schedule_ID)=2)) 
让我们更容易阅读:

WHERE (Shifts.Start_Date_Time Between #2015/09/26# And #2015/10/09#) AND (Shifts.Schedule_ID=1) OR (Shifts.Schedule_ID=2) 
所以就像:

WHERE A and B OR C
这将显示任何带有“A和B”的内容,以及任何带有“C”的内容,但您需要“A和B”或“A和C”


试试
和((Shifts.Schedule\u ID)=1)或((Shifts.Schedule\u ID)=2))
我完全同意括号的说法。它们确实让事情变得混乱。您上一次建议使用IN操作符,这无疑会使查询看起来更清晰,而且它也可以工作。我决定这样做。谢谢
SELECT Employees.Corps_ID, Employees.Last_Name, Employees.First_Name, Shifts.Start_Date_Time, Shifts.End_Date_Time, DateDiff('n',Shifts.Start_Date_Time,Shifts.End_Date_Time) AS SubTotalMinutes, Locations.Location_Name
FROM (Locations INNER JOIN Shifts ON Locations.Location_ID = Shifts.Location) INNER JOIN (Employees INNER JOIN Employees_Shifts ON Employees.Employee_ID = Employees_Shifts.Employee_ID) ON Shifts.Shift_ID = Employees_Shifts.Shift_ID 
WHERE (((Shifts.Start_Date_Time) Between #2015/09/26# And #2015/10/09#) AND ((Shifts.Schedule_ID)=1) OR ((Shifts.Schedule_ID)=2))) 
ORDER BY Employees.Last_Name;