我正在检索所有 expired_at 为零和 expired_at 大于当前时间。我试过这个:
expired_at
PriceRule.where("expired_at > ? OR expired_at = ?", DateTime.now, nil)
但那只是把唱片还给我 expired_at 大于 DateTime.now . 为什么 nil 被忽视?
DateTime.now
nil
00jrzges1#
您当前的查询检查 expired_at 等于null(通过 = NULL )这将无法评估为真。相反,您希望使用 IS NULL .因此,可以将查询调整为以下内容:
= NULL
IS NULL
PriceRule.where("expired_at > ? OR expired_at IS NULL", DateTime.now)
或者,如果你想保持你原来的论点结构,你可以通过 nil 如前所述:
PriceRule.where("expired_at > ? OR expired_at IS ?", DateTime.now, nil)
kmbjn2e32#
您还可以利用rails or 在这里,这将照顾到 IS NULL 而不是 = NULL . 我也建议使用 Time.current 相反,它对时区有更好的支持。
or
Time.current
PriceRule .where('expired_at > ?', Time.current) .or(PriceRule.where(expired_at: nil))
uplii1fm3#
我想你也可以使用以下语法
PriceRule .where(expired_at: DateTime.now..) .or(PriceRule.where(expired_at: nil))
3条答案
按热度按时间00jrzges1#
您当前的查询检查
expired_at
等于null(通过= NULL
)这将无法评估为真。相反,您希望使用IS NULL
.因此,可以将查询调整为以下内容:
或者,如果你想保持你原来的论点结构,你可以通过
nil
如前所述:kmbjn2e32#
您还可以利用rails
or
在这里,这将照顾到IS NULL
而不是= NULL
. 我也建议使用Time.current
相反,它对时区有更好的支持。uplii1fm3#
我想你也可以使用以下语法