【问题标题】:Counting days in a product life excluding the summers计算产品生命周期中的天数,不包括夏季
【发布时间】:2019-11-10 10:28:09
【问题描述】:

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

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

即。日期是 2017 年 10 月 31 日,我想要两列显示过去的夏季天数(= 2018 年的 30 天 * 4 个月+ 2019 年的 28 天 = 148 天)和过去的非夏季天数(11 月 17 日到 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");)

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

【问题讨论】:

    标签: mysql sql ms-access ms-access-2000


    【解决方案1】:

    也许不是最有效的方法,但最易读的方法可能是定义一个 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+F11 打开 VBA IDE
    • 通过转到 Insert &gt; ModuleAltIM 插入新的公共模块
    • 将上述函数定义复制到模块中,在Option 语句下方。
    • 用适当的名称保存模块。

    【讨论】:

    • 嗨!谢谢您的帮助。我理解你所写内容背后的逻辑,我只是​​在努力实现 vba 代码并从查询中调用它,因为我从未使用过 vba,我必须学习它。我已经使用您的 summerdays 代码创建了一个公共模块,但是当我尝试在 sql 代码中实现它时,我收到一条错误消息,提示“函数“SummerDays”未在表达式中定义”。我现在将整个查询发布在主帖中。
    • @GiacomoRabino 因为您是 VBA 新手,所以我在回答中添加了一些说明,描述了如何创建公共模块来容纳函数定义。
    • 谢谢,现在可以了。你真的帮助了我,我希望学习快速的 vba,因为它似乎真的可以让我的 sql 代码变得更强大。欢呼
    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2022-12-12
    • 1970-01-01
    相关资源
    最近更新 更多