根据没有年份的日期范围申报价值

Declare value based on date range without year

我在 Excel sheet 中有大约 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 中完成,以更简单的方法为准。

一些用于提取月份和日期的辅助列会很有用(假设值为 A1:A1000):

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

我们故意 "cheat" 关于年份以便于比较。
之后这里就没什么特别的了,就是嵌套了很多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")))

您可以在 Access 查询中使用 DateSerial Function。例如,您的 spring 播种季节可以表示为 ...

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

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

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

现在根据需要向下复制。

就是这样。

注意:这是通过计算一年中的第几天来计算的,例如 3 月 16 日是一年中的第 75 天。计算出 'day of the year' 后,将对与种植季节相对应的天数数组执行简单的二进制匹配。最后使用CHOOSE函数将MATCH结果翻译成赛季名称。

要编辑您的种植计划,只需调整此 'days of the year' 数组:{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","")