我试图做一个相当简单的查询,包括通过特定列获取两个日期之间的所有记录。
原始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,唯一的区别是构建后三个查询所需的少量字符串处理和类型处理。