Rails将DateTime转换为'where'查询中的日期

den*_*nko 6 ruby datetime ruby-on-rails date

我需要对数据库进行查询并按开始日期过滤事件,但列类型是DateTime.我在模型中做了范围:

scope :day, -> (start_date) {where start_date: start_date}
Run Code Online (Sandbox Code Playgroud)

它适用于相同的DateTime值,但我需要一个过滤器Event只能按日期,而不是DateTime.

我有PG数据库并尝试:

  scope :day, -> (start_date) {where("start_date:date =?", "#{start_date.to_date}")}  
Run Code Online (Sandbox Code Playgroud)

但是我收到了一个错误

Dee*_*eep 10

你可以这样做:

使用SQL Date函数(取决于数据库MySQL):

scope :on_day -> (start_date) { where("DATE(start_date) = ?", start_date.to_date) }
Run Code Online (Sandbox Code Playgroud)

或者使用范围(所以这将使用日期和时间来检查,只使用当天的开始和结束时间并执行BETWEEN查询):

scope :day, -> (start_date) { where start_date: start_date.beginning_of_day..start_date.end_of_day }
Run Code Online (Sandbox Code Playgroud)

或者如果在Rails 5.1上(这是Rails 5.1中引入的新助手):

scope :day, -> (start_date) { where start_date: start_date.all_day }
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 9

如果要将数据库值强制转换为日期,则必须为不同的数据库服务器执行不同的操作,例如mysql的以下内容:

scope :day, -> (start_date) {where("DATE(start_date) = ?", start_date)}
Run Code Online (Sandbox Code Playgroud)

因此,将start_date参数强制转换为日期时间可能更为合理:

scope :day, -> (start_date) {where start_date: start_date.to_datetime}
Run Code Online (Sandbox Code Playgroud)

此外,BigRon 在开始和结束之间发布了一个很好的过滤方法,Deep 发布了Rails 5.1的帮助程序,进一步简化了这种方法,但如果你想按日期过滤,你真的应该考虑你的数据库列是否真的需要是datetime单独.


Big*_*Ron 6

您可以使用范围从一天的开始到一天的结束:

scope :day, -> (start_date) {where start_date: start_date.beginning_of_day..start_date.end_of_day}
Run Code Online (Sandbox Code Playgroud)