Rails项目PostgreSQL数据库strftime函数报错求助
解决PostgreSQL下
strftime函数不存在的错误 嘿,我一眼就看出问题啦!你现在用的是PostgreSQL数据库,但查询语句里用了SQLite专属的strftime函数——PostgreSQL根本不认识它,这就是报错的核心原因。
问题根源
PostgreSQL没有strftime这个函数,它有自己的日期格式化函数to_char。不过更推荐你用Rails内置的日期查询方法,这样既优雅又能跨数据库兼容(不管是SQLite、PostgreSQL还是MySQL都能正常工作)。
解决方案1:改用PostgreSQL的to_char函数
如果你想继续用原生SQL的方式,可以把strftime换成to_char:
def today @vlts = Vlt.where("to_char(date_time, 'DD/MM/YYYY') = ?", Time.now.strftime('%d/%m/%Y')) end
解决方案2:更优雅的Rails风格查询(推荐)
Rails提供了非常方便的日期范围查询方法,完全不用写原生SQL字符串,代码可读性和兼容性都更好:
def today # 方法一:明确指定当日的时间范围 @vlts = Vlt.where(date_time: Time.zone.today.beginning_of_day..Time.zone.today.end_of_day) # 方法二:用Rails的快捷方法all_day,效果和上面完全一致 # @vlts = Vlt.where(date_time: Date.today.all_day) end
这个方法会自动生成适配当前数据库的SQL语句,比如在PostgreSQL里会转换成:
SELECT "vlts".* FROM "vlts" WHERE "vlts"."date_time" BETWEEN '2018-01-18 00:00:00' AND '2018-01-18 23:59:59.999999'
不仅避免了函数兼容问题,还能利用数据库的索引(如果date_time字段有索引的话),查询效率更高。
视图验证
你的视图代码完全没问题,只要@vlts能正确获取到当日的预订数据,循环就能正常渲染出表格行啦。
内容的提问来源于stack exchange,提问作者kokchun
相关产品推荐
相关产品推荐

