计算除夏季以外的产品生命周期中的天数

Counting days in a product life excluding the summers

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

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

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

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

非夏季天数

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");)

但它行不通,而且它只在今年夏天有效。我会接受任何想法。

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

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())

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

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

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

  • 使用Alt+F11
  • 打开VBAIDE
  • 通过转到 Insert > ModuleAltI、[=27 插入新的 public 模块=]M
  • 将上述函数定义复制到模块中 Option 语句下方。
  • 使用适当的名称保存模块。