查询PostgreSQL的time类型字段报invalid input syntax错误如何解决?
错误原因
你的assignments表start_time字段为PostgreSQL的time类型,仅存储时分秒信息,不包含日期。你请求中传入的参数是带日期的完整datetime格式2001-01-01T12:00:00,PostgreSQL无法直接将该格式的值转换为time类型用于范围查询,因此抛出格式错误。
你之前用limit(20)查询时没有用到传入的时间参数做过滤,不会触发类型转换,且Rails序列化time类型字段时会自动补一个默认的日期前缀(你输出中的2000-01-01就是这个默认前缀),所以JSON输出看起来和教程格式一致,仅在启用时间范围查询时才会暴露类型不匹配问题。
解决方案
根据你的业务场景二选一即可:
方案1:仅需按时间段查询(忽略日期,只匹配时分秒)
先提取参数中的时间部分再做查询,控制器代码修改如下:
def index # 解析传入的datetime参数,提取时分秒部分 start_time = Time.zone.parse(params[:start_time])&.strftime("%H:%M:%S") end_time = Time.zone.parse(params[:end_time])&.strftime("%H:%M:%S") @assignments = Assignment.where(start_time: start_time..end_time) end
对应的原生PostgreSQL查询语法为:
SELECT * FROM assignments WHERE start_time BETWEEN '12:00:00' AND '16:00:00';
方案2:业务需要关联日期存储排班时间
说明你字段类型选型错误,直接生成迁移把start_time、end_time字段改为datetime类型即可,无需修改查询逻辑,和教程保持一致就能正常运行。
内容的提问来源于stack exchange,提问作者thefonso
相关产品推荐
相关产品推荐

