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

Posted

技术标签:

【中文标题】SQL/ms-access 中的条件仅考虑月份中的某一天,而不是完整日期【英文标题】:Criteria in SQL/ms-access is only considering day of the month, not full date 【发布时间】:2018-04-02 11:47:08 【问题描述】:

注意:这是来自Syntax of MS Access/SQL sub-query including aggregate functions 的后续问题。

我正在尝试创建一个数据库来管理设备的维护。我有两张桌子:

一个(库存)包含每件设备的详细信息,包括购买日期和服务期限, 一个包含已完成工作的详细信息 (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。

【问题讨论】:

【参考方案1】:

粗略查看您的代码后,我不确定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#

【讨论】:

i.Equipmentw.Equipment 之间存在一对多关系,因为 Inventory 是一个列表所有设备,WorkDone 是完整的服务历史记录,因此每件设备都可能在 WorkDone 中出现多次。 这很奇怪:除了看起来更漂亮之外,我无法区分您的代码和我的代码,但是您的代码似乎可以工作,而我的代码却不行... @J.Warren 关于各种 Equipment 字段,我的观点是 i.EquipEment 拼写有一个额外的 e,而 w.Equipment 不是。 @J.Warren 请注意,在我的代码中,Nz 函数在 DateAdd 函数之前进行评估 - 这可能是差异的根源。

以上是关于SQL/ms-access 中的条件仅考虑月份中的某一天,而不是完整日期的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 中的条件联合,直到到达特定日期

在 DAX 中测量以计算仅适用于 Power BI 的所选月份的 YTD

仅包含日期和月份的Android日期选择器

如何在 django 中使用日期时间过滤器仅用于日期和月份?

在 sql (MS-Access) 中编写分组查询

MM 中的月份使用 Hive 中的 Month()