Ruby on Rails中如何比较日期和时间?

3

我收到这个参数:param[:date] = '2017-03-04'

我的数据库中创建的列是具有以下格式的created_at:'2017-01-01 09:21:23'

当我执行此查询时

Mymodel.where(created_at: params[:date]) 

这将返回一个空数组,这是合乎逻辑的,因为时间还未到。

我需要所有与参数日期对应的行。

我该如何做?在这种情况下,时间不重要,我只需要日期。
我正在使用Postgres作为数据库。

我需要选择例如某一特定日期的全部销售,并且用于搜索的列是created_at。

1个回答

7
这是一种类型强制转换的问题。因为created_at字段包含日期和时间,所以您的日期会被转换为查询中的2017-03-04 00:00:00。任何不完全匹配该时间戳的内容都将被排除。
解决这个问题有两种方法。
跨数据库通用方法:
将您的日期转换为一个范围对象。ActiveSupport提供了Date#all_day帮助程序来完成此操作的情况。
date = Date.parse(params[:date])

MyModel.where(created_at: date.all_day)

由于Date::parse在解析失败时会抛出异常,因此实际应用程序需要考虑到这一点。

my_models = begin
  date = Date.parse(params[:date])

  MyModel.where(created_at: date.all_day)
rescue ArgumentError
  MyModel.all
end

Postgres

您可以将created_at字段转换为date,这样只有日期部分会被匹配。

MyModel.where("created_at::date = ?", params[:date])

在 SQL 查询中仅更改 create_at 格式是否可行?只需获取 2017-01-01 并跳过时间? - matQ
@matQ 这取决于您使用的数据库。请具体说明,我可以提供更详细的信息。 - Adam Lassek
@matQ 我现在看到你说你正在使用Postgres。我会为此添加一个示例。 - Adam Lassek
还需要帮忙...如何添加其他参数? 例如:MyModel.where("created_at::date = ?", params[:date], seller_id: params[:seller_id])<= 这不起作用,请帮忙。提前致谢。 - matQ
@matQ,你可以添加任意数量的参数,例如 where("created_at::date = ?, seller_id = ?", params[:date], params[:seller_id])。或者你可以使用链式调用 where,我认为这样更加简洁:where("created_at::date = ?", params[:date]).where(seller_id: params[:seller_id]) - Adam Lassek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接