24

我有两个日期列 -from_dateto_date一个数据库表中。

例子:

  • from_date: 2012-09-10
  • to_date: 2012-09-30
  • today: 2012-09-13

today如果的日期介于from_date和之间,我需要获取所有记录to_date。如何使用 SQL 查询来做到这一点?

如果我已经加载了相应的记录,我可以很容易地确定今天的日期是否介于from_date和之间to_date,但我不知道如何直接从数据库表中获取这些记录。

4

8 回答 8

54

查看Rails 指南中的 Range 条件:

Client.where(created_at: (Time.now.midnight - 1.day)..Time.now.midnight)

这将产生以下 SQL:

SELECT * FROM clients WHERE (clients.created_at BETWEEN '2008-12-21 00:00:00' AND '2008-12-22 00:00:00')
于 2014-09-19T08:57:23.190 回答
25
data = ModelName.where("today >= from_date AND today <= to_date")
于 2012-09-13T11:09:58.077 回答
11

A secure and easy way to do this would be:

Model.where(':date BETWEEN from_date AND to_date', date: Date.current)
于 2017-12-20T16:16:04.353 回答
8

你可以这样使用:

Data = Model.where("date(now()) between from_date and to_date")
于 2016-11-02T15:11:42.223 回答
5
data = ModelName.find(:all, :conditions => "today >= from_date and today <= to_date")
于 2012-09-13T10:54:01.830 回答
3

这应该可以解决问题。

today = Date.today

data = ModelName.where("from_date <= ? AND to_date >= ?", today, today)
于 2016-10-03T08:38:13.830 回答
1

您可以使用下面的 gem 来查找日期之间的记录,

这个 gem 很容易使用和更清晰Star正在使用这个 gem,API 更清晰,文档也得到了很好的解释。

ModelName.between_times(Time.zone.now - 3.hours,  # all posts in last 3 hours
                  Time.zone.now)

在这里你也可以通过我们的领域ModelName.by_month("January", field: :updated_at)

请查看文档并尝试一下。

于 2015-02-05T13:04:23.950 回答
0

好的,在谷歌长时间搜索寻找一种“rails 方式”来使用两个日期字段和一个变量进行 BETWEEN 之后,我找到的最近似的解决方案是创建你自己的范围来做到这一点。

在您的 ApplicationRecord 中写入:

class ApplicationRecord < ActiveRecord::Base

  scope :between_fields, -> (value, initial_date, final_date) { 
    where "('#{value}' BETWEEN #{initial_date} AND #{final_date})"
   }

end

所以现在,无论你需要在哪里做一个,你都可以做:

@clients = Client.between_fields(params[:date], :start_date, :final_date)
# SELECT * FROM clients WHERE ('2017-02-16 00:00:00' BETWEEN start_date AND final_date)

您可以将其与其他“位置”结合起来,根据需要进行具体查询。

于 2017-02-16T16:13:27.783 回答