【问题标题】:Declare value based on date range without year根据没有年份的日期范围声明值
【发布时间】:2016-01-10 09:46:30
【问题描述】:

我在 Excel 表中有大约 10000 条记录(尽管如果更容易我可以导入 Access 2010),如果日期介于某些种植季节之间,我需要在单独的列中设置一个值。年份无关紧要。

因此,如果日期在某个范围内,则该列将填写其适当的种植季节。

Spring = 3/16 - 5/15 
Summer 5/16-8/15 
Fall 8/15-10/31 
Everything else is Null

3/20/2015 and 4/16/2013 are both "Spring" in the seasons column
6/28/2011 and 8/1/2015 are both Summer, etc.

关于如何做到这一点的想法?正如我所说,我可以在 Excel 或 Access 中完成,无论哪种方法更容易。

【问题讨论】:

    标签: excel ms-access ms-access-2010 excel-2010


    【解决方案1】:

    您可以在 Access 查询中使用DateSerial Function。例如,您的春季种植日期可以表示为 ...

    planting_date BETWEEN DateSerial(Year(planting_date), 3, 16) AND DateSerial(Year(planting_date), 5, 15)
    

    您可以在Switch 表达式中使用类似的模式来确定每个planting_date 的种植季节...

    SELECT
        y.planting_date,
        Switch
            (
                y.planting_date BETWEEN DateSerial(Year(y.planting_date), 3, 16) AND DateSerial(Year(y.planting_date), 5, 15), 'spring',
                y.planting_date BETWEEN DateSerial(Year(y.planting_date), 5, 16) AND DateSerial(Year(y.planting_date), 8, 15), 'summer',
                y.planting_date BETWEEN DateSerial(Year(y.planting_date), 8, 16) AND DateSerial(Year(y.planting_date), 10, 31), 'fall',
                True, Null
            ) AS season
    FROM YourTable AS y;
    

    如果您想将这些季节值存储在名为 planting_season 的字段中,请在 UPDATE 查询中使用 Switch 表达式 ...

    UPDATE YourTable AS y
    SET y.planting_season =
        Switch
            (
                y.planting_date BETWEEN DateSerial(Year(y.planting_date), 3, 16) AND DateSerial(Year(y.planting_date), 5, 15), 'spring',
                y.planting_date BETWEEN DateSerial(Year(y.planting_date), 5, 16) AND DateSerial(Year(y.planting_date), 8, 15), 'summer',
                y.planting_date BETWEEN DateSerial(Year(y.planting_date), 8, 16) AND DateSerial(Year(y.planting_date), 10, 31), 'fall',
                True, Null
            );
    

    【讨论】:

    • 我已经在 Excel 中获得了数据,并且 Amit 的回答有效,所以我认为没有必要尝试您的建议。也许有一天,当我没有落后于计划时,我可以测试一下。
    【解决方案2】:

    此公式假定第一个日期在单元格 A1 中。在 B1 单元格(或第 1 行的另一个空单元格)中输入公式:

    =CHOOSE(MATCH(A1-DATE(YEAR(A1),1,0),{0;75;136;227;305},1),"","Spring","Summer","Fall","")
    

    现在根据需要向下复制。

    就是这样。

    注意:这是通过计算一年中的哪一天来实现的,例如 3 月 16 日是一年中的第 75 天。一旦计算出“一年中的某一天”,就会对与您的种植季节相对应的天数数组执行简单的二进制匹配。最后,使用CHOOSE函数将MATCH结果翻译成赛季名称。

    要编辑您的种植时间表,只需调整这个“一年中的几天”数组:{0;75;136;227;305}

    注意:这是一个非常有效的自包含公式。不需要外部辅助列,也没有嵌套或其他 IF 函数。

    附录:这是一个变体,其中包含处理闰年的子句:

    =CHOOSE(MATCH(A1-DATE(YEAR(A1),1,0),{0;75;136;227;305}+(2=MONTH(DATE(YEAR(A1),2,29))),1),"","Spring","Summer","Fall","")
    

    【讨论】:

    • @user12059 请考虑这种直接方法。这是一个简单的查找,不需要任何辅助单元格,也没有嵌套的 IF 函数。
    • 我不确定您在哪里声明日期范围。 Amit 的回答的美妙之处在于它很容易理解,而且我知道在日期范围发生变化时如何以及在何处编辑它们。也许对您的公式的作用进行细分会有所帮助。
    • @user12059 答案已更新,并解释了它的工作原理。请重新考虑您的答案选择。此答案使用四个函数调用,比所选答案的效率高很多倍……除了三个帮助列之外,它还使用十五个函数调用。
    【解决方案3】:

    一些帮助列来提取月份和日期会很有用(假设值在 A1:A1000):

    B1 = MONTH(A1)
    C1 = DAY(A1)
    D1 = DATE(2000, B1, C1)

    为了便于比较,我们故意“作弊”。
    之后,这里就没什么特别的了,就是嵌套了很多ifs:

    IF(AND(D1 >= DATE(2000, 3, 16), D1 <= DATE(2000, 5, 15)), "Spring",
       IF(AND(D1 >= DATE(2000, 5, 16), D1 <= DATE(2000, 8, 15)), "Summer",
       IF(AND(D1 >= DATE(2000, 8, 16), D1 <= DATE(2000, 10, 31)), "Fall", "Winter")))
    

    【讨论】:

    • 该公式有一个例外,B1=Month(A1)。我不确定你为什么要提前一个月。
    • @user12059 因为我的想法是在 JavaScript 中:-)。现已修复。
    猜你喜欢
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多