根据没有年份的日期范围申报价值
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" 关于年份以便于比较。
之后这里就没什么特别的了,就是嵌套了很多if
s:
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","")
我在 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" 关于年份以便于比较。
之后这里就没什么特别的了,就是嵌套了很多if
s:
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","")