8

我正在尝试按“created_at”日期查找记录-数据库列类型是“日期时间”,我正在使用来自 jQuery 的 UI DatePicker

我的网址如下所示:“localhost:3000/users_supported?selected_date=2012-10-31”

到目前为止我做得很好:) 我在控制器中的查询如下所示:

@support_histories = current_agent.support_histories.where(:created_at => Date.parse(params[:selected_date]))

如何仅从“日期时间”数据库列中按“日期”正确提取记录

我尝试在 Rails 控制台中执行此操作,但没有运气:

sh = SupportHistory.where(:created_at => DateTime.parse('2012-10-31'))
sh = SupportHistory.where(:created_at => Date.parse('2012-10-31'))
sh = SupportHistory.where(:created_at => DateTime.strptime('2012-10-31', '%Y-%m-%d'))

如果我确实像下面提到的那样,我会得到记录,但这对我没有用,因为我试图按“日期”而不是“日期时间”查找记录

sh = SupportHistory.where(:created_at => '2012-10-31 19:49:57')
4

5 回答 5

32
selected_date = Date.parse(params[:selected_date])
# This will look for records on the given date between 00:00:00 and 23:59:59
sh = SupportHistory.where(
       :created_at => selected_date.beginning_of_day..selected_date.end_of_day)

时区可能是您需要考虑的问题,但如果您的所有时间都在同一个时区,这应该可以工作。

于 2012-11-04T03:33:00.827 回答
2

我有时使用的一个简单解决方案是将日期(时间)字段转换为数据库上的文本,而不是在应用程序端将字符串解析为日期。对于您的情况,这将是:

where('CAST(created_at AS text) LIKE ?', params[:selected_date])

在数据库上可能不是最有效的(取决于您使用它的上下文),但在应用程序端节省了大量的皮塔。

于 2017-03-31T13:16:58.547 回答
1

我通过在下面的模型中创建一个方法解决了这个问题,比如说,我的模型是 ticket.rb

 def created_date
   self.created_at.to_date
 end

然后我这样查询,

 selected_date = Date.parse(params[:date])

 Ticket.all.map{|t| t if t.created_date == selected_date}.compact

这为我提供了与用户选择的日期相匹配的准确结果。

于 2016-01-26T16:29:08.723 回答
0

您当前的查询不起作用,因为您正在查询日期时间列上的日期。这是两种不同的数据类型。

对于日期时间列,您需要一个日期时间过滤器。您可以通过将DateTime对象传递给 where 子句来做到这一点。但是,在您的情况下,您需要一整天的记录,因此您将指定介于00:00:00和之间的范围23:59:59

在 Rails 5.1 之前:

SupportHistory.where(created_at: date.beginning_of_day..date.end_of_day)

Rails 5.1 及更高版本:(这将使用#all_day生成完全相同的范围)

SupportHistory.where(created_at: date.all_day)
于 2021-11-23T14:55:27.880 回答
0

如果要解析特定的日期时间

SupportHistory.where("created_at>=?", DateTime.parse('10 Dec 2021 11:54:00 PST -08:00'))
于 2021-12-23T11:23:08.067 回答