2011-05-13 6 views
0

쿼리에 많은 문제가 있습니다. 나는 이것을 어떻게 잘 설명 할 지 모르지만, 시도 할 것입니다.시간대를 고려하면서 datetime 범위 쿼리

기본적으로 datetime 필드에 시간대와 함께 게시 된 날짜와 시간을 유지하는 'posted_at'필드가있는 여러 개체가 있습니다. 내가 쿼리하고 그 개체와 날짜로 범위를 얻을 필요가있다.

이전에는 Date로 변환하고 다른 Date 개체와 비교했습니다. Postgre 날짜로 변환 할 때

Date(posted_at) >= :start_date AND Date(posted_at) <= :end_date 

그러나, 그 쿼리에 정확하지 않고 결과를 발생 시간대 정보를 분실 : 쿼리는 다음과 같이이었다.

그래서,이 변경이 나에게 정확한 결과를 얻을 수 있지만, 그것은 또한 끔찍한 성능을 가지고 있으며, 내 응용 프로그램에서 일부 시간 제한을 일으키는

if start_date then 
    start_time = Time.zone.parse("#{start_date.year}-#{start_date.month}-#{start_date.day}") 
    conditions << "posted_at >= :start" 
    hash[:start] = start_time 
end 

if end_date then 
    end_time = Time.zone.parse("#{end_date.year}-#{end_date.month}-#{end_date.day}").end_of_day 
    conditions << "posted_at <= :end" 
    hash[:end] = end_time 
end 

.

이 쿼리를 수행하는 다른 방법을 찾지 못하고 정확한 결과를 유지할 수 없습니다. 누군가에게 조언이나 아이디어가 있습니까?

미리 감사드립니다.

답변

1

데이터베이스에 시간대 정보를 저장하고 싶지 않습니다.

http://derickrethans.nl/storing-date-time-in-database.html

당신은 tadman 알 수 있듯이 더 나은 결과를 얻을 수 있습니다 : 당신의 타임 스탬프 at time zone 'utc'에 새 필드를 추가하고 인덱스를

다음은 함정의 일부를 설명 읽기입니다. 그런 다음 posted_at between ? and ?을 사용하여 물건을 가져올 수 있습니다.

+0

감사합니다. Denis, 그건 정말로 알고 있어야합니다. – MarceloJ

0

시작 시간과 종료 시간을 UTC로 변환하는 것이 더 많은 행운을 가져다 줄 수 있습니다.이 시간대는 쿼리를 만들 때 시간대를 지정하지 않는 것이 일반적입니다. 이것은 충분히 쉽게 이루어집니다 :

posted_at BETWEEN :start AND :end 

하여도 당신이 검색하는 필드에 인덱스를 가지고해야합니다, 또는 당신은 끔찍한 얻을 것이다 : 당신은 또한 당신의 쿼리를 조정할 수 있습니다

start_date.to_time.to_datetime.beginning_of_day.utc 
end_date.to_time.to_datetime.end_of_day.utc 

가 될 공연.

+0

필드의 색인이 생성되어 두 가지 방법을 모두 시도했습니다. 그래도 약간의 타임 아웃이 발생한다 : ( – MarceloJ

+0

''log/development.log'에서 어떤 쿼리를 생성하고 있는가?이 쿼리에서'EXAMINE'을 사용해 보았는가? 일반적으로 문제가있을 수있는 부분이 하이라이트로 표시된다 – tadman

+0

나는 문제가 ' 정말로 쿼리는 아니지만 수백만 개의 행이 있다는 사실 ... 날짜를 비교할 때 모든 것이 올바르게 작동했기 때문에 여기에서 어떤 사람들과 이야기를 나누었고 날짜를 유지하는 새로운 인덱싱 된 열을 만들 것입니다. – MarceloJ