布尔值与打卡计算

从本文开始我将逐渐涉及一些相对复杂和烦琐的 Notion 函数书写,不过请各位不要看到长长的一串公式就感到害怕,其实很多时候它只是看着长一点、密集一点,我们唯一需要的就是耐住性子,然后花一点点时间即可掌握这些函数的原理和写法。

基础概念

在上一篇文章中,我们介绍了 Notion 的数字、日期、以及字符串这三种数据类型,而 Checkbox 则是剩下的最后一种类型,即布尔值。
布尔值是一种计算机编程术语,并且有真(True)和假(False)之分,其中 True=1,False=0,基于这点我们可以利用布尔值在 Notion Formula 中进行一些比较复杂的操作。
Checkbox 与布尔值
在 Notion Formula 中,我们可以将 Checkbox 的打勾和非打勾状态分别对应布尔值的 True 和 False。
例如在下图中我创建了一个 Checkbox 字段和 Formula 字段,当我用 toNumber() 函数将 Checkbox 转换为数字的时候可以看到,打勾的值是 1,不打勾的值是 0,如此一来我们就可以对 Checkbox 进行各种计算统计了。
notion image
逻辑判断与布尔值
在 Formula 中,我们可以直接使用 >、< 或者两个等号 == 来进行逻辑判断。
例如在下面的数据库中,我们用公式来判断「消费额」这个字段是否超过了 300,如果超过,则布尔值为 true 并将自动显示为打钩状态,否则布尔值为 false 并显示为非打钩状态:
notion image
如此一来我们就可以对这个 Formula 进行分组操作,分别是「打勾组」和「非打勾组」:
notion image
另外,我们还可以用两个等号==来判断两个字段是否相同,如果相同则为 true,不同则为 false:
notion image
日期判断与布尔值
除了可以直接对数字进行大小对比,我们也同样可以用 >、<、==这三个符号来对比日期并获得相应的布尔值:
notion image

Checkbox 与打卡计算

在前面的基础介绍中,我们已经可以用 toNumber() 这个函数来将 Checkbox 的打勾和非打勾状态转换为数字 1 或者 0,如此一来我们就可以去计算多个 Checkbox 的打勾百分比:
notion image
在下面的案例中,我们将一周七天的 Checkbox 都用 toNumber() 函数转换为数字,将这些数字相加,并将求得的和除以 7,如此就能计算每周的打卡完成度:
notion image
公式写法可参考:
但这时你可能会发现,上面的计算结果的小数位有点多,就算将 Formula 字段的数字格式设置为百分比(percent)的话,似乎也无法保留小数点后两位:
notion image
这里我们可以用 round() 这个函数来进行优化操作,它的作用是对数字进行四舍五入,如下图所示:
notion image
所以如果我们希望将 0.857142 变成 86%,就需要以下 3 个步骤:
  1. 将 0.857142 扩大 100 倍,变成 85.7142
  1. 使用 round() 函数将 85.7142 四舍五入取整为 86
  1. 将 86 缩小 100 倍,变成 0.86
所以公式写法如下:
notion image
另外再补充两个也许你有可能会用到的函数:
floor() 函数的作用是将数字的小数位全部舍去,即向下取整
notion image
ceil() 函数的作用则是向上取整
notion image

日期间隔计算(dateBetween)

日期间隔计算同样是 Notion 函数中相对高频的一项需求,它的基础写法如下,请注意dateBetween 的 B 不能小写
这个公式的计算逻辑是,用 时间 1 减去 时间 2,然后用第三个参数“days” 来作为相差时间的单位,如下图所示:
notion image
注意这里的 days 还可以按照实际的计算需求,替换下面的另外几种单位:
日期间隔的参数
含义
years
年数差
months
月数差
days
天数差
hours
小时差
minutes
分钟数差
seconds
秒数差
所以在相同的日期计算结果之下,如果用不同的日期间隔参数,就可以求出不同的效果,如下图所示:
notion image

案例 1、计算单个日期字段内的时间差

当我们在 Date 字段中开启了 End time 的选项后,我们将可以同时设定它的开始时间与结束时间:
notion image
但这样一来我们就没办法直接使用 dateBetween 这个函数来对它进行计算,所以我们需要执行以下步骤:
使用 dateStart() 和 dateEnd() 两个函数将「开始时间」和「结束时间」提取出来
notion image
然后再用 dateBetween() 函数对提取出来的时间进行计算
notion image
或者也可以将 dateStart() 以及 dateEnd() 直接写进 dateBetween 函数中:
notion image

案例 2、客户定期联络表

在一个客户关系维护表中,我们决定为每个客户设置一个最长 3 个月的定期联络间隔,当上一次的联络时间与今天的日期间隔相差 90 天以上,则判定为「需要联络」。
具体操作步骤如下:
  1. 使用 now() 函数获取今天的日期
  1. 用 dateBetween 计算今天与上次联络的时间间隔,单位设置为 days
notion image
接下来我们需要寻找那些间隔日期大于 90 天的计算结果,并将其判定为「需要联系」。
这里我们有两种筛选方式,一种是新建一个视图,然后对 Formula 进行筛选,只要筛选出那些间隔大于 90 天的字段即可
notion image
另一种则是直接使用前文提到的布尔值来进行判断,我们只需要将 dateBetween() 的计算结果与 90 进行大小比较,只要大于 90 即为 True,小于 90 即为 False,如此一来就可以通过查看 Checkbox 的勾选状态快速判断,现在有哪一位客户是需要联络的。
notion image
我们还可以应用《Notion Button 详解》一文中学到的内容,为每个客户单独创建一个 Button,点击 Button 即可刷新「上次联络时间」这个字段,这样想必会更方便一些。
notion image

案例 3、更准确的倒数日计算

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