如何正确转换或查询Rails/MySQL DateTime列的日期范围

Str*_*ine 6 ruby mysql sql datetime ruby-on-rails

我有一个rails应用程序,我将created_at存储为datetime(标准).我正在构建一个搜索表单,我发现我必须使用find_by_sql来执行一些复杂的子查询.表单有一个日期范围(没有时间)来搜索items_at字段的项目.

我发现的问题是,如果我只传入范围的日期字符串来查询...

... status_changes.created_at between '2009-01-24' and '2009-03-12' ...
Run Code Online (Sandbox Code Playgroud)

我收回了创建日期为2009-01-23 17:10:39 -0800的记录,因为它存储在数据库中,如2009-01-24 01:10:39(UTC)

我如何解决这个问题,以便结果不会返回有问题的记录?

我似乎需要将日期范围转换为UTC特定的,或者告诉find_by_sql根据当前时区进行搜索,而不是将列读取为utc ...

任何接受者?

约翰

fiv*_*six 11

现代ActiveRecord的做法是:

Model.where(time_field: date1..date2)
Run Code Online (Sandbox Code Playgroud)


Ian*_*ell 7

如果你不使用find_by_sql,而是使用find带有:conditions让Rails做替换的子句,它将自动转换所有内容.

Model.find :all, 
  :conditions => ["created_at between ? and ?", start_date, end_date]
Run Code Online (Sandbox Code Playgroud)

最糟糕的情况是,如果Rails被日期混淆,你可以将它们转换为时间,它应该很好地运行:

Model.find :all, 
  :conditions => ["created_at between ? and ?", 
                   start_date.to_time, end_date.to_time]
Run Code Online (Sandbox Code Playgroud)


Jor*_*ock 4

我知道这是一个老问题,但在回答有关 CONVERT_TZ 的 Streamlines 查询时:

除非您加载了 mySQL 命名的时区表(这在普通安装中几乎不可能),否则您需要输入时区作为 UTC 的偏移量。

CONVERT_TZ(status_changes.created_at, '+00:00', '+08:00') between '2009-01-24' and '2009-03-12')
Run Code Online (Sandbox Code Playgroud)