Supabase查询当前时间处于timestampz字段区间内的数据报错求助
问题原因
你的查询失败核心有两个问题:
- 时间格式不兼容:PostgreSQL的
timestampz类型不支持Date.now()返回的毫秒时间戳,也不识别Date()生成的非标准时间字符串,这就是你看到两类错误的直接原因。 - (补充:你的条件逻辑是正确的——要查询当前时间处于
valid_from和valid_to区间内的条目,对应valid_from ≤ 当前时间 ≤ valid_to,只需修正时间格式即可)
解决方案
有两种可靠的解决方式:
方式一:传递标准ISO 8601时间字符串
在TypeScript中生成符合PostgreSQL要求的ISO格式时间字符串,替换你的时间变量:
const currentTimestamp = new Date().toISOString(); // 生成类似 "2024-01-26T12:35:28.000Z" 的标准格式 const result = await serviceSupbaseClient .from("lobby") .select("id, name, valid_from, valid_to") .lte("valid_from", currentTimestamp) .gte("valid_to", currentTimestamp); // 注意:如果查询结果可能有多个条目,不要用.single(),否则会报错;仅确认唯一结果时再添加该方法
方式二:直接使用数据库当前时间(推荐)
避免前端与数据库的时间偏差,直接调用PostgreSQL内置的now()函数获取服务器当前时间,无需在前端处理时间:
const result = await serviceSupbaseClient .from("lobby") .select("id, name, valid_from, valid_to") .lte("valid_from", "now()") .gte("valid_to", "now()");
额外注意
- 若你需要查询所有符合条件的条目,请移除
.single()方法,该方法仅用于获取唯一结果,存在多条匹配数据时会抛出错误。 - 再次确认数据库中
valid_from和valid_to字段确实为timestampz类型,避免字段类型不匹配导致的隐性问题。
内容的提问来源于stack exchange,提问作者progNewbie
相关产品推荐
相关产品推荐

