2013-09-06 3 views
1

사용자 모델에서 레코드를 검색하고 있습니다. from_date, to_date 검색 속성은 created_at 열을 기반으로 사용자 모델에서 검색된 레코드에 사용됩니다.Rails 일광 절약 시간제 검색 중

User model : (id, name, created_at) 

데이터베이스에 다음 레코드가 있습니다. "2013년 9월 4일".to_date (FROM_DATE) 및 "2013년 9월 5일".to_date (TO_DATE) 사이

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 

난 검색하고, 첫 번째 두 개의 레코드가 반환된다. 마지막 하나는 반환되지 않습니다. 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) 

쿼리에 어떤 문제가 있습니까? 나는 거기에 일광 시간대 문제가 있다고 생각합니다. WHERE 절에

CAST(users.created_at AS DATE) 

을 :

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) } 

희망이

+0

, 그것은 실제로 날짜 시간입니다) – MrYoshiji

+0

은 무엇입니까 실제 SQL이 생성되고 있습니까? 내 생각 엔 레일즈와 데이터베이스 사이의 시간대 변환을 실행하고 있다는 것입니다. –

+0

@PhilipHallstrom 그것은 다음 sql을 생성합니다 : SELECT'users'. * FROM'users' WHERE ('users'.'created_at'> = '2013-09-04'AND'users'.created_at' < '2013-09 -06 ') – Kumar

답변

1

당신은 날짜로 created_at 필드를 캐스팅해야 도와 줘요!


보너스 : CAST의 짧은 버전은, PostGre SQL 작동 :

당신은 날짜로 created_at 열을 행사할 필요가
scope :by_date, lambda{ |date_range| where("users.created_at::date BETWEEN ? AND ?", date_range.min, date_range.max) } 
+0

매력처럼 작동했습니다. 고맙습니다. – Kumar

+0

어쩌면 나는 나쁜 날을 보내고 있습니다. 그러나 이것이 정말로 시간대 문제가 아니며 문제의 날짜가 표시되지 않는 한 원래의 SQL (<...- 06 '이)이 작동하지 않는 이유를 이해할 수 없습니다. 현지 시간이지만 실제로는 UTC에서 "다음 날"이며 캐스팅과 함께 "하루 전"으로 바뀌고 있습니다. 원래 SQL은 제 환경에서 작동합니다. –

관련 문제