我在用户模型中搜索记录。搜索属性from_date,to_date将用于基于created_at列搜索用户模型中的记录。
User model : (id, name, created_at)
我在数据库中有以下记录。
id, name, created_at
1 jd1 2013-09-04 18:01:57
2 jd2 2013-09-05 19:01:57
3 jd3 2013-09-05 23:01:57
当我在“2013-09-04”.to_date(from_date)和“2013-09-05”.to_date(to_date)之间进行搜索时,只返回前两个记录。最后一个没有被退回。当我将to_date更改为“2013-09-06”时,显示最后一条记录。这是我使用的查询。
date_range = from_date ... to_date + 1.day
scope :by_date, ->(date_range) {where(created_at: date_range)}
User.by_date(date_range)
查询有什么问题?我认为它有白天时区问题。
答案 0 :(得分:1)
您需要将created_at字段转换为Date:
CAST(users.created_at AS DATE)
在where子句中:
where("CAST(users.created_at AS DATE) BETWEEN ? AND ?", date1, date2 )
在您的情况下,使用您的范围:
scope :by_date, lambda{ |date_range| where("CAST(users.created_at AS DATE) BETWEEN ? AND ?", date_range.min, date_range.max ) }
希望这有帮助!
加分: CAST的简短版本适用于PostGre SQL:
scope :by_date, lambda{ |date_range| where("users.created_at::date BETWEEN ? AND ?", date_range.min, date_range.max ) }