0

我正在尝试做一个相当简单的查询,该查询涉及通过特定列获取两个日期之间的所有记录。

原始 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

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

4

1 回答 1

1

您在日期文字上缺少引号,您希望从以下内容开始:

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,唯一的区别是构建后三个查询所需的少量字符串处理和类型处理。

于 2020-09-16T21:57:00.490 回答