原始 SQL 转换为 ActiveRecord 查询时导致错误的查询(Firebird 数据库)
Raw SQL Query that causes error when translated to ActiveRecord Query (Firebird Database)
我正在尝试执行一个相当简单的查询,该查询涉及通过特定列获取两个日期之间的所有记录。
原始 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,唯一的区别是构建后三个查询所需的字符串处理和类型处理量很小。
我正在尝试执行一个相当简单的查询,该查询涉及通过特定列获取两个日期之间的所有记录。
原始 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,唯一的区别是构建后三个查询所需的字符串处理和类型处理量很小。