2024-12-02|閱讀時間 ‧ 約 8 分鐘

Notion Formula 2.0 § 其他日期運用

前言

我喜歡的大神 Red Gregory(以下稱紅姊)發表過一篇文章〈4 Advanced Date Formulas In Notion To Copy〉,那時 Notion 的公式還是 1.0 版本,現在我們來練習將有需要的公式轉換成 2.0 格式。

我自己經常使用其中的幾個公式,所以將練習過程和結果記錄下來,方便日後查找和參考。

練習題

練習一:將 Name 欄位的日期轉為對應日期

我自己常用的日記模板中,是使用「日期」作為 Name 欄位的資料,輸入格式為「西元年份 + 月份 + 日期」。平時,我會先在 Excel 等工具中大批量生成這種數字字串,然後將格式如 2024.10.01 的日期拉出 31 行,並複製到 Notion 中。透過紅姊的公式,就可以匹配 Name 欄位的日期(字串型態),轉變成對應的日期。

以下是紅姊原本的公式(月-日-年):

dateAdd(dateAdd(dateAdd(dateSubtract(dateSubtract(dateSubtract(dateSubtract(dateSubtract(now(), year(now()), "years"), month(now()), "months"), date(now()) - 1, "days"), hour(now()), "hours"), minute(now()), "minutes"), toNumber(slice(prop("Name"), 6, 10)), "years"), toNumber(slice(prop("Name"), 0, 2)) - 1, "months"), toNumber(slice(prop("Name"), 3, 5)) - 1, "days")

依照紅姊的公式邏輯,以前我改過的公式如下(年-月-日):

dateAdd(dateAdd(dateAdd(fromTimestamp(0), toNumber(substring(replaceAll(replaceAll(replaceAll(prop("Name"), "/", ""), "-", ""), " ", ""), 0, 4)) - 1970, "years"), 
toNumber(substring(replaceAll(replaceAll(replaceAll(prop("Name"), "/", ""), "-", ""), " ", ""), 5, 7)) - 1, "months"), toNumber(substring(replaceAll(replaceAll(replaceAll(prop("Name"), "/", ""), "-", ""), " ", ""), 8, 10)) - 1, "days")

由於紅姊的方式考慮到大多數人習慣使用「/」、「-」、「.」來分隔年、月、日,單純用幾個replace()就可以滿足大部分需求。不過,既然我已經規範了日期格式為「年-月-日」,而且想多練習一些技巧,那麼我們可以引入正則表達式(regex)的概念。

在這裡使用 regex 其實相當簡單,只需要保留數字部分即可,用「\D」來去除所有非數字的字符,效果如下圖。

lets(
日期字串, replaceAll(prop("Name"), "\\D", ""), /* 將欄位的日期字串保留數字部分*/
年份, toNumber(substring(日期字串, 0, 4)),
月份, toNumber(substring(日期字串, 4, 6)),
日期, toNumber(substring(日期字串, 6, 8)),

fromTimestamp(0)
.dateAdd(年份 - 1970, "years")
.dateAdd(月份 - 1, "months")
.dateAdd(日期 - 1, "days")
)

※注意:在輸入日期格式時,月份跟日期都要補足兩位數,例如三月就要輸入03。

這題比較難的是,我們需要將指定欄位的字串資料,轉變成數字,再轉變成日期。

練習二:時間區間換算天、時、分

這是之前有同好提出過的問題,其實這題不難,只是需要一些步驟。

最直接的方法是使用dateBetween()函數計算開始和結束時間之間的差值,並以分鐘作為單位,接著再將分鐘轉換為其他時間單位。

  • 1 小時 = 60 分鐘
  • 1 天 = 24 小時 = 1440 分鐘

通過這些基本換算,我們就能輕鬆完成時間區間的換算。

lets(
結束時間,prop("日期區間").dateEnd(),
開始時間, prop("日期區間").dateStart(),
分鐘差, dateBetween(結束時間, 開始時間, "minutes"),
, floor(分鐘差 / 1440),
, floor((分鐘差 -* 1440) / 60),
, floor((分鐘差 -* 1440 -* 60)),
+ " 天 " ++ " 小時 " ++ " 分鐘"
)

練習三:判斷時間區間是否有包含今天

最後一個練習也是之前很多同好有碰到的需求。

在專案或任務管理中,某些項目會顯示為一段時間的範圍,而待辦清單需要篩選「當天」且「尚未完成的項目」的條件。

當只有一個日期時,我們可以簡單地使用 today() 來判斷是否為當天,但若涉及時間區間,就需要比較開始時間與結束時間,才能準確篩選出符合條件的項目。

lets(
結束時間,prop("日期區間").dateEnd(),
開始時間, prop("日期區間").dateStart(),
if(today() >= 開始時間 and today() <= 結束時間, true, false)
)

範例當天的日期是2024.10.15。

結語

目前日期相關的公式,我就先更新到這裡 🎉,我還有找到很多有趣的運用,會再慢慢地分享的。

這個系列真的是比較花時間與心力,如果你覺得挺有幫助的,請幫我點讚、分想、留言,或是請我喝杯咖啡☕、奶茶🧋~萬分感謝 ❤️。

範例頁面

將Name轉成日期

時間區間

參考資料



分享至
成為作者繼續創作的動力吧!
Hola ~ 我是 Chloe ❤ 透過手作讓自己學習專注、平靜, 透過記錄讓自己梳理心情、反思。 想了解我如何觀察這個世界的細節嗎? 想知道我如何規劃自己的紀錄方式嗎? ✨ 歡迎關注我的分享 ✨
© 2024 vocus All rights reserved.