0

我有一个查询(在 MS Access 2013 中),它按日期为我提供各种项目的销售额,在接下来的 12 个月中的每一天。在另一个表中,我为每个项目提供了已知的采购提前期,比如 30 到 90 天。我创建了一个查询,对于每个项目,我根据提前期计算了未来日期,使用:

FutureDate: DateAdd("d",[Leadtime],Date())

我验证了 Sales 查询中存在的所有项目,并且所有 FutureDates 都在 Sales 中存在的记录中。

我需要计算从现在到计算出的每个项目的 [FutureDate] 之间的每日销售额总和,以获得在每个项目的唯一提前期内预期的总销售额。

我尝试了具有奇怪结果的函数 DSUM():

每日销售额的查询已经排除了任何过去的销售额,所以我的第一次尝试是:

TotalSalesInLeadtime: DSUM("DailySales","Sales","[DayOfSale]<=#" & [FutureDate] & "# AND [Item]='" & [SearchedItem] &"'")

对于某些项目,[TotalSalesInLeadtime] 计算正确,而其他项目评估为 Null。

然后我尝试了:

TotalSalesInLeadtime: DSUM("DailySales","Sales","[DayOfSale] BETWEEN #" Date() "# AND #" & [FutureDate] & " AND [Item]='" & [SearchedItem] &"'")

现在的结果发生了逆转。[TotalSalesInLeadtime] 值现在对于之前显示为 Null 的项目正确显示,并且对于之前正确评估的项目为 Null。

我从来不明白为什么 DSUM() 会这样做。

为了解决 DSUM() 故障,我使用了一个嵌入式子查询,它正确地产生了所有值,尽管性能受到了重大影响:

SELECT [PurchItem],
        (SELECT Sum([DailySales]) AS SumOfSales
         FROM [Sales] 
         WHERE ([Item]=[LeadtimeItems].[PurchItem]) AND ([DayOfSale] Between Date() AND [LeadtimeItems].[FutureDate]))
        As TotalSalesInLeadtime
FROM LeadtimeItems

如果有人知道为什么 DSUM 可能会有这种行为,我将不胜感激。DSUM,当它工作时,肯定看起来更快。

4

1 回答 1

1

当“粘合在一起”SQL 语句(或片段)时,包括包含在哈希标记 ( #) 中的日期文字,必须记住,mm-dd-yyyy无论系统范围的日期格式如何,Access SQL 和 VBA 都会始终将不明确的日期文字解释为。因此,在一台配置了 Windows 的机器上dd-mm-yyyy,像 4 月 30 日这样的明确日期可以正常工作。

?DateSerial(2013,4,30)
30-04-2013 
?"#" & DateSerial(2013,4,30) & "#"
#30-04-2013#
?Eval("#" & DateSerial(2013,4,30) & "#")
30-04-2013 

...但是第二天,即 5 月 1 日,事情就不那么顺利了

?DateSerial(2013,5,1)
01-05-2013 
?"#" & DateSerial(2013,5,1) & "#"
#01-05-2013#
?Eval("#" & DateSerial(2013,5,1) & "#")
05-01-2013 

所以教训是,任何时候我们将日期文字“粘合在一起”,我们必须确保这些日期采用明确的格式,例如yyyy-mm-dd. 对于这个特定的问题,我们需要使用

TotalSalesInLeadtime: DSUM("DailySales","Sales","[DayOfSale]<=#" & Format([FutureDate], "yyyy-mm-dd") & "# AND [Item]='" & [SearchedItem] &"'")
于 2013-10-18T07:45:29.693 回答