1

我正在尝试编写一个 ms 访问 SQL 查询,以计算自两年内某个日期以来经过的天数:“夏季”(从 1/6 到 30/09)和非夏季(从 1/ 1 至 30/05 和 1/10 至 31/12)。

这个日期是产品的最后“测量”,它可能长达两年。然后我想知道,和今天一样,自从测量产品以来,已经过了多少天的夏季,反之亦然有多少天是非夏季。

IE。日期是 2017 年 10 月 31 日,我想用两列显示过去的夏季天数(= 30 天 * 2018 年的 4 个月+ 2019 年的 28 天 = 148 天)和非夏季过去的天数(11 月 17 日到 5 月 17 日之间的 7 个月+ Ott18 的 8 个月)至 5 月 19 日 = 450 天)

我一直在尝试使用像这样的 IIF 周期:(ANNI 是一个变量,表示我们在哪一年 0 = 今年,过去一年等)

非夏天的日子

IIF(ANNI=0; "150"; IIF(ANNI=1;   
IIF(G2.DATA_PRODUZ<#01/06/2018#;DateDiff("d",[G2]! 
[DATA_PRODUZ],#01/06/2018#)+90+150;                              
IIF(G2.DATA_PRODUZ>#30/08/18#;DateDiff("d",[G2]! 
[DATA_PRODUZ],#31/12/2018#)+150));"etc");)

但它不会起作用,而且它只会在今年夏天起作用。我会接受任何想法。

4

1 回答 1

2

也许不是最有效的方法,但肯定最易读的方法可能是定义一个 VBA 函数(在公共模块中),例如:

Function SummerDays(ByVal dateFrom As Date, ByVal dateTo As Date) As Long
    While dateFrom < dateTo
        If dateFrom >= DateSerial(Year(dateFrom), 6, 1) And dateFrom <= DateSerial(Year(dateFrom), 9, 30) Then
            SummerDays = SummerDays + 1
        End If
        dateFrom = dateFrom + 1
    Wend
End Function

然后从您的查询中调用它:

SummerDays(G2.DATA_PRODUZ, Date())

然后,对于非夏季,您可以使用反向if语句定义另一个函数,或者从两个日期之间的总天数中减去夏季天数,例如:

DateDiff("d",G2.DATA_PRODUZ, Date()) - SummerDays(G2.DATA_PRODUZ, Date())

要创建一个公共模块来定义上述函数:

  • Alt使用+打开 VBA IDEF11
  • 通过转到Insert > ModuleAlt, I,插入一个新的公共模块M
  • 将上述函数定义复制到模块中的Option语句下方。
  • 使用适当的名称保存模块。
于 2019-06-28T17:50:20.720 回答