<aside> 💡 2023-11-02 修改注:Notion 于近期发布了 Formulas 2.0 版本,对大量函数的语法及输出值进行了修改,因此本文所包含公式的部分语法已不可用。为便于理解,本文保留了最初的公式,但出于避免产生误解的目的,又在不可用的公式后方新增了标注,并在每个小节后方附上了优化后的新公式。如果「太长不看」,读者也可以直接拷贝每个小节最后的新公式进行使用。

</aside>

用 Excel 公式计算星座与年龄听上去并不是一件困难之事,在搜索引擎上也能找到现成的答案。但是如若使用 Notion 的函数体系来执行这个任务的话,似乎就成为了一种挑战。

我这里 Notion 里有一个数据库,记载了我各路亲朋好友的小孩子们的大名、小名以及生日。为了不错过这些小朋友们的生日,我利用了 Notion 的函数功能来自动计算他们的星座、年龄以及距离下次生日的倒计时,就像这样(数据已脱敏处理):

Untitled

这些函数公式我也同时用在了其他的一些数据库里,例如在我的「设备清单」中,我可以直观地看到这些设备的服役时长。接下来我就详细说说这里面的实现原理。

本文已经假设你对 Notion 的函数体系有了初步的了解。如果你还不太了解,可以看看少数派作者 Niin 的这篇文章:建立强大的 Notion 数据库,从了解函数开始

星座的计算方式


Excel 里有一个现成的星座计算公式:

=LOOKUP(--TEXT(D2,"mdd"),{101,"摩羯座";120,"水瓶座";219,"双鱼座";321,"白羊座";420,"金牛座";521,"双子座";622,"巨蟹座";723,"狮子座";823,"处女座";923,"天秤座";1024,"天蝎座";1123,"射手座";1222,"摩羯座"})

为了移植到 Notion 中来,我们可以使用 if 这个函数,它其中一种用法是 boolean ? value : value。仿照 Excel 公式的思路,先通过 (month(prop("生日")) + 1) * 100 + date(prop("生日") 这个算式将生日转化为 mdd 格式,然后加入 if 的嵌套判断,就形成了使用 Notion 函数计算星座的方法:

((month(prop("生日")) + 1) * 100 + date(prop("生日")) >= 1222) ? "摩羯座" : (((month(prop("生日")) + 1) * 100 + date(prop("生日")) >= 1123) ? "射手座" : (((month(prop("生日")) + 1) * 100 + date(prop("生日")) >= 1024) ? "天蝎座" : (((month(prop("生日")) + 1) * 100 + date(prop("生日")) >= 923) ? "天秤座" : (((month(prop("生日")) + 1) * 100 + date(prop("生日")) >= 823) ? "处女座" : (((month(prop("生日")) + 1) * 100 + date(prop("生日")) >= 723) ? "狮子座" : (((month(prop("生日")) + 1) * 100 + date(prop("生日")) >= 622) ? "巨蟹座" : (((month(prop("生日")) + 1) * 100 + date(prop("生日")) >= 521) ? "双子座" : (((month(prop("生日")) + 1) * 100 + date(prop("生日")) >= 420) ? "金牛座" : (((month(prop("生日")) + 1) * 100 + date(prop("生日")) >= 321) ? "白羊座" : (((month(prop("生日")) + 1) * 100 + date(prop("生日")) >= 219) ? "双鱼座" : (((month(prop("生日")) + 1) * 100 + date(prop("生日")) >= 120) ? "水瓶座" : (((month(prop("生日")) + 1) * 100 + date(prop("生日")) >= 101) ? "摩羯座" : ""))))))))))))

/* 注:最新版 Notion 修改了 month(date) 函数,该公式基于旧版本撰写,仅供参考,更新后的公式见本节最下方。 */

Untitled

<aside> 💡

**2023-11-02 更新:**由于 Notion Formulas 2.0 已支持声明变量,且 Notion Formulas 2.0 对 month(date) 函数进行了修改,month(prop("生日")) 转化为 mdd 格式的时候不需要额外 +1 了,经过优化的最新版公式如下:

</aside>

let(
  x, ((month(prop("生日")) * 100) + date(prop("生日"))),
  (x >= 1222) ? "摩羯座" : ((x >= 1123) ? "射手座" : ((x >= 1024) ? "天蝎座" : ((x >= 923) ? "天秤座" : ((x >= 823) ? "处女座" : ((x >= 723) ? "狮子座" : ((x >= 622) ? "巨蟹座" : ((x >= 521) ? "双子座" : ((x >= 420) ? "金牛座" : ((x >= 321) ? "白羊座" : ((x >= 219) ? "双鱼座" : ((x >= 120) ? "水瓶座" : ((x >= 101) ? "摩羯座" : ""))))))))))))
)

年龄的计算方式


把年龄表述为「y 岁」似乎没有什么难度,但我想把年龄表述成「y 岁 m 个月 d 天」这种格式。用 Excel 实现的话大概是这样:

=DATEDIF(D2,TODAY(),"Y")&" 岁 "&DATEDIF(D2,TODAY(),"YM")&" 个月 "&DATEDIF(D2,TODAY(),"MD")&" 天"

但是用 Notion 函数实现就相对麻烦一些。最简单的方案是仿照上述 Excel 公式的方式,使用 dateBetween 函数分别计算岁数、余月、以及余日,再用 format 将数字转换成字符串,然后使用 concat 函数将多个字符串拼接在一起。