在mysql中查询时如何获取时间?

时间:2019-04-17 07:16:10

标签: mysql sql ruby-on-rails

如何在适当的SQL查询中编写此rails查询?

time = (Time.now - 1.days).beginning_of_day
Assignment.where("created_at >= :time OR updated_at >= :time", time: time).pluck(:assignable_id).uniq

您能帮我在SQL查询中进行转换吗?

select distinct assignable_id from assignments where created_at >= getDate() && updated_at >= getDate();

我需要有关如何在查询时获取日期的帮助吗?

2 个答案:

答案 0 :(得分:0)

您可以使用CURDATE()使用MySQL获取日期。

您的查询将如下所示:

select distinct assignable_id from assignments where created_at >= CURDATE() AND updated_at >= CURDATE();

答案 1 :(得分:0)

无法仅通过ActiveRecord直接使用不平等比较,您将不得不使用Arel,它是ActiveRecord所基于的较低级别的api。幸运的是,您大多数时候都可以混合搭配它们。

time = (Time.now - 1.days).beginning_of_day
assignments = Assignment.arel_table
Assignment.where(
  assignments[:created_at].gteq(time).or(assignments[:updated_at].gteq(time))
).distinct.pluck(:assignable_id)

在大多数情况下,从红宝石代码传递当前日期是一个很好的解决方案。但是,如果您确实想使用数据库功能,那么Arel会在这里再次提供帮助。

time = Arel::Nodes::NamedFunction.new('getDate', [])
# or
time = Arel::Nodes::NamedFunction.new('CURDATE', [])
# or any other function you can think of

Arel确实比乍看之下要写原始sql更为复杂,但是关键是可重用性和安全性。通过将Arel代码片段制作为方法,它们易于重用。使用原始sql容易导致注入错误,Arel会阻止您在大多数™️情况下犯这些错误。