區間型別: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 < end | Cell 與半開查詢區間重疊:cell.start < end 且 cell.end > start |
contains_point | 一個標準 datetime 字串 | 該時間點位於 cell 內:cell.start <= point < cell.end |
is_empty / is_not_empty | 省略 value | Cell 不存在或存在 |
舊版 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;v1require規則不接受 interval 運算元。 - 要清除選填的 interval,請送
null。空字串在寫入時會被當成空值接受,但會以""儲存,presence 運算子會把它算作「存在」。
動手試試
到 API Playground 建立 interval,以 records.create 寫入兩個相鄰時段,再分別用 overlaps 與 contains_point 搜尋。