访问日期计算

时间:2018-02-07 22:54:47

标签: sql date ms-access

我很擅长访问SQL并试图找出这个日期计算的含义:

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

任何帮助解释都会很棒。

感谢。

2 个答案:

答案 0 :(得分:4)

让我们看看最后一个表达式:

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

如果将函数参数分离到它们自己的行,则更容易阅读:

DateAdd(
    "d",
    -1,
    DateAdd(
        "m",
        8,
        DateAdd(
            "d",
            - ( Day( Date() ) - 1 ),
            Date()
        )
    )
)
  • DateAdd( "d", a, b )添加a - 多天到b
  • DateAdd( "m", a, b )添加a - 许多个月到b
  • ( Day( Date() ) - 1 )是今天的日期,减1(Date()2017-02-07,结果是6
  • DateAdd( "d", -6, Date() )将从今天起减去6天,结果为2017-02-01
  • DateAdd( "m", 8, (2017-02-01) )会在2017-02-01后添加8个月,因此结果为2017-10-01
  • DateAdd( "d", -1, (2017-10-01) )将从2017-10-01减去1天,结果为2017-09-30

因此,您最初发布的表达式变为:> Date() AND < (2017-09-30)。这不是有效的SQL,因为比较运算符<>=各需要两个操作数。作者可能认为它们像BETWEEN运算符一样被使用,但它们是错误的。

出于好奇,我将这些DateAdd操作变成了一个函数,并在2017年生成了函数与日期范围的关系图:

enter image description here

看起来它的功能是获取当前最后一天的日期,距现在8个月,所以2017年1月的任何Date()({{1 } {}导致01-31

答案 1 :(得分:0)

使用 DateSerial 可能更简单,至少更容易理解:

>DateSerial(Year(Date()), Month(Date()) + 8, 0)

另外,我想它确实应该读>=,因此您的标准可以是:

>Date() And <=DateSerial(Year(Date()),Month(Date())+8,0)