Skip to Content
核心概念欄位型別區間

區間型別:interval

用途

當一個 cell 需要保存完整日期時間範圍,例如預約時段、會議室訂位或工作班次時,使用 interval。開始與結束界線會一起存在同一格,並採半開語意 [start, end)。當這一對界線本來就是一個業務值時,便不必協調兩個獨立 datetime 欄位。

建立 schema

送出以下 columns.create body:

{ "name": "預約時段", "type": "interval", "required": true, "description": "保留的 wall-clock 時段" }

Interval 可以設為 required,但不能有 default_value、max_length、options、附件設定或計算欄設定:columns.create 與 tables.create 會以 422 拒絕其中任何一項,之後透過 columns.update 送出 default_value 或 options 則是 400。由於對已有 live 紀錄的表新增 required 欄位必須提供預設值,上面的 body 只有在表內沒有任何 live 紀錄時才會成功;對已有資料的表,請先新增為選填、補齊每一列,再用 columns.update 設成 required: true。

合法與不合法的值

可寫入的 cell 必須是只含 start 與 end 的物件。兩個值都使用標準 datetime 格式,而且 end 必須嚴格晚於 start:

{ "data": { "預約時段": { "start": "2026-09-01 09:00", "end": "2026-09-01 10:30" } } }

以下值不合法:

{ "data": { "預約時段": { "start": "2026-09-01T09:00:00+08:00", "end": "2026-09-01 09:00", "timezone": "Asia/Taipei" } } }

第一個界線不是標準 YYYY-MM-DD HH:mm 值、兩個界線沒有遞增,而且物件多了額外 key;只給一邊的物件也會被拒絕。讀取時會原樣回傳這個雙字串物件;後端不會附加或轉換時區。

查詢與排序

Interval predicate 屬於 typed predicate,因此凡是接受 stored_filters 或 any_of 的地方都能使用——records.search、records.export、已存視圖的 config 與 public-read 查詢——但不能透過舊版 filters 物件;predicate 的 column 要填 interval 欄位的內部鍵:

{ "stored_filters": [ { "column": "col_33333333_3333_4333_8333_333333333333", "op": "overlaps", "value": ["2026-09-01 09:30", "2026-09-01 11:00"] } ] }
運算子值意義
overlaps兩元素 [start, end] 標準 datetime 陣列,且 start < endCell 與半開查詢區間重疊:cell.start < end 且 cell.end > start
contains_point一個標準 datetime 字串該時間點位於 cell 內:cell.start <= point < cell.end
is_empty / is_not_empty省略 valueCell 不存在或存在

舊版 filters 物件不支援 interval cell,eq、between、within_last 等純量運算子也一律不接受:在 stored_filters 與 any_of 中,上表以外的運算子是 400,訊息為 interval columns support only overlaps/contains_point/is_empty/is_not_empty (got '<op>');between 會拆成兩個界線編譯,因此顯示 (got 'gte');在 search 或 export 中,name_eq 或 name_contains 會更早以 Op '<op>' is only valid on user/social_client columns — '<column>' is type 'interval'. 失敗,而 saved view 與 public-read query 會先以 Op '<op>' cannot be saved in a view — … 拒絕任何顯示名稱運算子。overlaps 或 contains_point 的值若違反上表——例如界線不是標準的 YYYY-MM-DD HH:mm 字串、overlaps 的值不是恰好兩個界線,或 start 不早於 end——會在請求驗證階段以 422 失敗;公開讀取查詢則改回 400 invalid body: …。單欄 sort_by 與多欄 sort 都可以指定 interval;排序使用它的 start 界線。

規則與跨介面限制

若同一個 link scope 內的 live rows 不得互相衝突,使用帶 interval_column 的 no_overlap 規則。規則也可以要求以分鐘表示的最小間隔。

Interval 雖然直接內嵌儲存且可寫,但不屬於 stored scalar。它不能當 unique 成分、upsert match_column、IaC record natural key、formula 運算元、lookup/rollup 目標、row-policy 運算元、aggregate metric 或 group_by key。CSV/XLSX 匯入 cell 是字串,無法建立必要的 {start, end} 物件,因此 interval 不是檔案匯入目標。

Custom Table agent 透過它的列寫入工具(insert、update、upsert 與 bulk 動作)寫入 interval cell,直接通道與確認通道皆然。cell 使用與 REST 相同的 {start, end} 物件,並在建立 proposal 或寫入任何東西之前,以 REST 驗證器檢查,因此格式錯誤或前後顛倒的一組值會以 REST 的訊息被拒絕,例如 Field '<column>' end must be strictly after start;確認 proposal 會顯示 {start, end} 的值本身。要讀取 interval,agent 會把問題交給 custom_tables_analyze,它的 query_records 工具在 filters 與 any_of 中接受對 interval 欄位使用 overlaps、contains_point、is_empty 與 is_not_empty,半開區間語意與 REST 相同。其中 overlaps 使用另一個兩元素的 [start, end] 清單,絕不是已儲存的 cell 物件,回應的 total 會計入符合的資料列。它的 sort_column 與多鍵 sort 依 start 界線排序 interval,紀錄 id 遞增作為同值的次序。interval 欄位上的其他運算子一律被拒絕;aggregate_records、join_aggregate 與 correlation 拒絕 interval filter,沒有任何分析工具能對 interval 做 group 或彙總,profile_column 也會拒絕 interval。

注意事項

  • 界線是 wall-clock 字串,必須嚴格使用 YYYY-MM-DD HH:mm;秒、T、Z 與 offset 都會被拒絕。
  • 半開語意允許前一個區間恰好在下一個區間開始時結束。
  • Schema retype 進入或離開 interval 時,不會重新解讀舊純量或物件;無法轉換的 cell 會走一般 migration reset 路徑。
  • Interval 的存在契約是 required: true;v1 require 規則不接受 interval 運算元。
  • 要清除選填的 interval,請送 null。空字串在寫入時會被當成空值接受,但會以 "" 儲存,presence 運算子會把它算作「存在」。

動手試試

到 API Playground 建立 interval,以 records.create 寫入兩個相鄰時段,再分別用 overlaps 與 contains_point 搜尋。

Last updated on