计算除夏季以外的产品生命周期中的天数
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 > Module
或 Alt、I、[=27 插入新的 public 模块=]M
- 将上述函数定义复制到模块中
Option
语句下方。
- 使用适当的名称保存模块。
我正在尝试编写一个 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 > Module
或 Alt、I、[=27 插入新的 public 模块=]M - 将上述函数定义复制到模块中
Option
语句下方。 - 使用适当的名称保存模块。