如何从 MS Access 中破译复杂的 DATEADD 函数

How to decipher complex DATEADD function from MS Access

我从一个旧的 MS Access 数据库继承了一个查询,我终其一生都无法弄清楚这个日期参数函数试图做什么。我通常只使用 SQL ,这似乎有点不同。任何人都可以帮助描述这个逻辑在做什么吗?

use pdx_sap_user 
go

select po_number, 
       po_issue_date 

from   vw_po_header 

where po_issue_date > getDate() And PO_issue_date < DateAdd("d",-1,DateAdd("m",8,DateAdd("d",-(Day(getDate())-1),getDate())))

我认为如下:

  1. 取当前日期
  2. 当月的当天减去-1 得到当月的第一天
  3. 为此增加 8 个月
  4. 减去 1 天得到上个月的最后一天

所以它计算出大约 8 个月的截止日期。

但我想知道 PO 签发日期在未来如何...

首先Access中没有getDate()功能。可能应该是 Date(),return 是当前日期。
现在从内部表达式开始:
Day(Date()) return 以整数表示的当前日期 1-31
因此,在 DateAdd("d", -(Day(Date())-1), Date()) 中,从当前日期减去需要的天数到 return 当前月份的 1 号。

那么:

DateAdd("m", 8, DateAdd("d", -(Day(Date())-1), Date()))

将 8 个月加到当前月份的 1 号上return将 8 个月后日期的月份的 1 号加到
最后:

DateAdd("d", -1,...)

从上一个表达式 return 的日期减去 1 天,return 该日期上个月的最后一天。
所以如果你今天 运行 13-Sep-2019 这段代码,结果将是:

30-Apr-2020

因为这是8个月后上个月的最后一天

您可以使用 DateSerial:

对其进行大量去混淆处理
where 
    po_issue_date > getDate() And 
    po_issue_date < DateSerial(Year(getDate()), Month(getDate()) + 8, 0)