SQL/ms-access 中的条件仅考虑每月的日期,而不是完整日期

Criteria in SQL/ms-access is only considering day of the month, not full date

注意:这是来自 的跟进问题。

我正在尝试生成一个数据库来管理设备维护。我有两个表:

一个(库存)包含每件设备的详细信息,包括购买日期和服务期限, 一个包含已完成工作的详细信息 (WorkDone),包括完成工作的日期 (Work Date)。 我想要一个显示下次维修日期的查询。到目前为止我有:

SELECT Max(NZ(DateAdd('m', i.[Service Period], w.[Work Date]),
          DateAdd('m', i.[Service Period], i.[Purchase Date]))
      ) AS NextServiceDate, i.Equipement
FROM Inventory i LEFT JOIN WorkDone w ON i.ID = w.Equipment
GROUP BY i.Equipement

我现在想在 NextServiceDate 之前订购,并且只显示 NextServiceDate 在下周的条目。但是添加

HAVING (((Max(Nz(DateAdd('m',i.[Service Period],w.[Work Date]),DateAdd('m',i.[Service Period],i.[Purchase Date]))))<DateAdd('ww',1,Date()))
ORDER BY Max(Nz(DateAdd('m',i.[Service Period],w.[Work Date]),DateAdd('m',i.[Service Period],i.[Purchase Date])));

仅在距现在不到一周的日期时显示(例如,如果今天是第一天,它将显示 NextServiceDate 出现在前 7 天的所有条目任何一年任何一个月的天数,过去或未来)。出于某种原因,它只考虑一个月中的第几天而不是完整的日期。我不明白为什么...

注意:我有一个英国系统,所以日期格式是 dd-mm-yyyy。

粗略检查了您的代码后,我不确定 i.Equipement 的实例是否有错字(因为您的 JOIN 子句引用了类似的字段 w.Equipment),或者这两个字段是否有意命名不同?


我看不出您的代码有任何其他错误,但如果您将代码重组为以下内容,可能会更清晰、更容易调试:

SELECT 
    Max(sub.dat) as NextServiceDate, sub.eqp
FROM
(
    SELECT 
        DateAdd('m',i.[Service Period],Nz(w.[Work Date],i[Purchase Date])) as dat, i.Equipement as eqp
    FROM
        Inventory i LEFT JOIN WorkDone w ON i.ID = w.Equipment
) AS sub
GROUP BY 
    sub.eqp
HAVING 
    Max(sub.dat) < DateAdd('ww',1,Date())
ORDER BY 
    Max(sub.dat)

请注意,区域日期格式的差异只会在您指定文字日期(例如,作为标准)时产生影响,在这种情况下,您需要遵守格式 #mm/dd/yyyy#