布尔值与打卡计算
从本文开始我将逐渐涉及一些相对复杂和烦琐的 Notion 函数书写,不过请各位不要看到长长的一串公式就感到害怕,其实很多时候它只是看着长一点、密集一点,我们唯一需要的就是耐住性子,然后花一点点时间即可掌握这些函数的原理和写法。
基础概念
在上一篇文章中,我们介绍了 Notion 的数字、日期、以及字符串这三种数据类型,而 Checkbox 则是剩下的最后一种类型,即布尔值。
布尔值是一种计算机编程术语,并且有真(True)和假(False)之分,其中 True=1,False=0,基于这点我们可以利用布尔值在 Notion Formula 中进行一些比较复杂的操作。
Checkbox 与布尔值
在 Notion Formula 中,我们可以将 Checkbox 的打勾和非打勾状态分别对应布尔值的 True 和 False。
例如在下图中我创建了一个 Checkbox 字段和 Formula 字段,当我用
toNumber() 函数将 Checkbox 转换为数字的时候可以看到,打勾的值是 1,不打勾的值是 0,如此一来我们就可以对 Checkbox 进行各种计算统计了。逻辑判断与布尔值
在 Formula 中,我们可以直接使用
>、< 或者两个等号 == 来进行逻辑判断。例如在下面的数据库中,我们用公式来判断「消费额」这个字段是否超过了 300,如果超过,则布尔值为 true 并将自动显示为打钩状态,否则布尔值为 false 并显示为非打钩状态:
如此一来我们就可以对这个 Formula 进行分组操作,分别是「打勾组」和「非打勾组」:
另外,我们还可以用两个等号
==来判断两个字段是否相同,如果相同则为 true,不同则为 false:日期判断与布尔值
除了可以直接对数字进行大小对比,我们也同样可以用
>、<、==这三个符号来对比日期并获得相应的布尔值:Checkbox 与打卡计算
在前面的基础介绍中,我们已经可以用
toNumber() 这个函数来将 Checkbox 的打勾和非打勾状态转换为数字 1 或者 0,如此一来我们就可以去计算多个 Checkbox 的打勾百分比:在下面的案例中,我们将一周七天的 Checkbox 都用
toNumber() 函数转换为数字,将这些数字相加,并将求得的和除以 7,如此就能计算每周的打卡完成度:公式写法可参考:
但这时你可能会发现,上面的计算结果的小数位有点多,就算将 Formula 字段的数字格式设置为百分比(percent)的话,似乎也无法保留小数点后两位:
这里我们可以用
round() 这个函数来进行优化操作,它的作用是对数字进行四舍五入,如下图所示:所以如果我们希望将
0.857142 变成 86%,就需要以下 3 个步骤:- 将 0.857142 扩大 100 倍,变成 85.7142
- 使用
round()函数将 85.7142 四舍五入取整为 86
- 将 86 缩小 100 倍,变成 0.86
所以公式写法如下:
另外再补充两个也许你有可能会用到的函数:
floor() 函数的作用是将数字的小数位全部舍去,即向下取整ceil() 函数的作用则是向上取整日期间隔计算(dateBetween)
日期间隔计算同样是 Notion 函数中相对高频的一项需求,它的基础写法如下,请注意
dateBetween 的 B 不能小写这个公式的计算逻辑是,用
时间 1 减去 时间 2,然后用第三个参数“days” 来作为相差时间的单位,如下图所示:注意这里的
days 还可以按照实际的计算需求,替换下面的另外几种单位:日期间隔的参数 | 含义 |
years | 年数差 |
months | 月数差 |
days | 天数差 |
hours | 小时差 |
minutes | 分钟数差 |
seconds | 秒数差 |
所以在相同的日期计算结果之下,如果用不同的日期间隔参数,就可以求出不同的效果,如下图所示:
案例 1、计算单个日期字段内的时间差
当我们在 Date 字段中开启了
End time 的选项后,我们将可以同时设定它的开始时间与结束时间:但这样一来我们就没办法直接使用
dateBetween 这个函数来对它进行计算,所以我们需要执行以下步骤:使用
dateStart() 和 dateEnd() 两个函数将「开始时间」和「结束时间」提取出来然后再用
dateBetween() 函数对提取出来的时间进行计算或者也可以将
dateStart() 以及 dateEnd() 直接写进 dateBetween 函数中:案例 2、客户定期联络表
在一个客户关系维护表中,我们决定为每个客户设置一个最长 3 个月的定期联络间隔,当上一次的联络时间与今天的日期间隔相差 90 天以上,则判定为「需要联络」。
具体操作步骤如下:
- 使用
now()函数获取今天的日期
- 用
dateBetween计算今天与上次联络的时间间隔,单位设置为days
接下来我们需要寻找那些间隔日期大于 90 天的计算结果,并将其判定为「需要联系」。
这里我们有两种筛选方式,一种是新建一个视图,然后对 Formula 进行筛选,只要筛选出那些间隔大于 90 天的字段即可
另一种则是直接使用前文提到的布尔值来进行判断,我们只需要将
dateBetween() 的计算结果与 90 进行大小比较,只要大于 90 即为 True,小于 90 即为 False,如此一来就可以通过查看 Checkbox 的勾选状态快速判断,现在有哪一位客户是需要联络的。我们还可以应用《Notion Button 详解》一文中学到的内容,为每个客户单独创建一个 Button,点击 Button 即可刷新「上次联络时间」这个字段,这样想必会更方便一些。

案例 3、更准确的倒数日计算
在案例 1 和案例 2 的倒数日计算中,其实我们忽略了一个问题,那就是直接将日期与日期、或者将日期与
now() 进行计算,都有可能得出不准确的倒数日。例如下图,7 号、8 号与
now() 计算得出的倒数日都是 0而在下图中,因为「项目 02」的 Date 2 字段包含了具体时间点(5:00 AM),于是 Date 1 和 Date 2 的日期间隔就出现了错误:
问题的根源出现在
dateBetween() 函数的时间单位上。前面我们对
dateBetween() 函数的写法一直都是 dateBetween(Date 1,Date 2,"days") ,也就是用 days来作为时间间隔的单位,那么当两个日期之间,间隔的小时数不满 24,days 就不会将它算作一天,于是就得出了错误的间隔天数。要解决这个问题,我们需要先梳理一下
now() 函数和一般 Date 字段的一些特性。now() 这个函数除了会获取日期,还会获取当前的时间点:Date 这个字段在默认情况下都是将时间设定为当天的零点
所以:
- 当今天的
now()与明天的 Date 进行计算时,计算出的结果就有可能不满 24 小时
- 或者当不带时间的 Date 1 与带具体时间的 Date 2 进行计算, 也有可能得出不满 24 小时的结果
- 当我们使用
"days"作为dateBetween的间隔单位时,在不满 1 天的情况下,它就会返回 0 的值
找到原因之后,我们继续往下分析。
既然
now() 返回的日期会带上时间,并且 Date 的默认时间点都是 12:00 AM,那如果我们把 now() 或者 Date 字段的时间都设置成 12:00 AM 这个默认值的话,就可以正确地与任意的 Date 进行计算了。为了达到这个目的,我们还需要继续学习函数
hour() 与 dateSubtract() 的用法。hour() 函数
我们可以利用
hour() 从某个日期中截取出它的时间是处在第几个小时,如下图所示:同一批公式还有
day()、month()、year()、minute(),分别可以将一周的第几天,一年的第几个月,日期所在的年份,或者时间的第几分钟计算出来。dateSubtract() 函数
这个函数的作用是为某个时间减去你所指定的时间长度,它的写法是
dateSubtract(日期字段,数字,单位),括号内的参数按照顺序解读即是:- 读取某个确定的日期
- 设置要减去的数字
- 设置数字所对应的时间单位
以下图为例,我对 Date 这个字段设置的函数效果是「减去 3 个月」,所以:
- 2023/07/22 变成了 2023/04/22
- 2023/03/31 变成了 2022/12/31
接下来让我们耐住性子,再来回顾一下最初的需求:
- 我们的最终目的是要将
now()或者 Date 所获得的时间设置成默认的12:00 AM
- 假设
now()的时间是16:30 PM,我们就要减去16:30 PM才能获得12:00 AM
- 所以我们需要先用
hour()和minute()这两个函数分别获得now()的小时和分钟
- 然后再用
dateSubtract()这个函数减去now()的小时和分钟
具体流程写法如下
使用
dateSubtract() 减去 now() 的小时在步骤 1 的基础上,继续使用
dateSubtract() 减去 now() 的分钟在步骤 2 的基础上,使用
dateBetween() 计算正确的日期间隔(这里假设 Date 没有带上具体时间)最终完整流程如下
通过这个案例想必大家应该已经能够感受到,如果你有意学习 Notion Formula 的用法,那么必然会在这个过程中遭遇非常多的坎坷和挫折,我本人作为 Formula 的新手实在感触颇深,很多时候为了解决一个小小的问题,背后却需要引出一连串更加复杂的问题,所以还请做好必要的心理准备。
以下内容于 01 月 07 日更新
关于 Formula 2.0 新增的功能和细节更新
本文基于 Formula 2.0 新增的功能和细节,进行了部分细节上的修订和优化
建议先阅读本栏目关于 Formula 2.0 的这篇介绍文章:《功能追踪 01》,了解 Notion 函数的最新写法
以下内容于 2023 年 11 月 12 日更新
关于 Formula 功能的内容更新
关于 Formula 2.0 功能介绍的文章 《功能追踪 01:详细解读 Notion Formula 2.0,这 10+ 个新特性 & 新函数让 Notion 更强大更好用》已发布,在本文修订前,可以先行阅读该文章。
以下内容于 2023 年 09 月 08 日更新
关于 Notion 近期的 Formula 功能更新
Notion 近期对 Formula 进行了巨量的更新优化,包括操作界面、部分函数写法均可能有所变动,但本文整体的使用思路是可以沿用的,您依然可以参考和学习。为了不耽误正篇的更新进度,我将在第五章更新结束后,尽快对本文内容进行修改调整。







