原始SQL查询在转换为ActiveRecord查询(火鸟数据库)时会导致错误



我试图做一个相当简单的查询,包括通过特定列获取两个日期之间的所有记录。

原始SQL在ISQL Firebird:中运行良好

SELECT * FROM OPS_HEADER
WHERE PB_BOL_DT
BETWEEN '2020-09-01' AND '2020-09-10';

这是我的ActiveRecord转换:

OpsHeader.where('pb_bol_dt BETWEEN 2020-09-01 AND 2020-09-10')

上面这行给了我一个错误:

expression evaluation not supported expression evaluation not supported Only one operand can be of type TIMESTAMP

我可能把它转换错了,但看起来这确实是正确的方法……我不知道为什么它会给我带来这么多麻烦。

如果日期文字中缺少引号,则需要以开头

OpsHeader.where(%q(pb_bol_dt BETWEEN '2020-09-01' AND '2020-09-10'))

但是你可以让ActiveRecord通过传递一个范围来构建一个BETWEEN:

OpsHeader.where(pb_bol_dt: '2020-09-01' .. '2020-09-10')

让AR处理报价。您也可以使用位置占位符或命名占位符分别传递端点:

OpsHeader.where('pb_bol_dt between ? and ?', '2020-09-01', '2020-09-10')
OpsHeader.where('pb_bol_dt between :lower and :upper', lower: '2020-09-01', upper: '2020-09-10')

所有这些最终都会向数据库发送相同的SQL,唯一的区别是构建后三个查询所需的少量字符串处理和类型处理。

最新更新