我正试图编写一个ms-access SQL查询,以便计算自一个日期以来经过两年的天数:“夏季”(从1/6到30/09)和非夏季(从1/1到30/05和从1/10到31/12)。
这个日期是该产品的最后一个“测量”日期,可能长达两年。
然后我想知道,和今天一样,夏天有多少天,反之亦然,自从产品被测量以来,已经过了多少天的非夏天。
也就是说,日期是2017年10月31日,我想用两列来表示已经过去的夏季天数(2018年30天*4个月+2019年28天=148天)和已经过去的非夏季天数(11月17日至5月17日之间的7个月+8个月,从Ott18日至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");)

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

最佳答案

也许不是最有效的方法,但最可读的方法肯定是定义一个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())

然后,对于非夏季天数,您可以使用inverseif语句定义另一个函数,或者从两个日期之间的总天数中减去夏季天数,例如:
DateDiff("d",G2.DATA_PRODUZ, Date()) - SummerDays(G2.DATA_PRODUZ, Date())

创建一个公共模块来定义上述功能:
使用Alt+F11打开VBA IDE
通过转到Insert > Module或Alt,I,M插入新的公共模块
将上述函数定义复制到Option语句下面的模块中。
用适当的名称保存模块。

07-24 19:25