2011-01-11 4 views
1

약간 복잡한 시간 계산 문제가 있습니다. 사용자가 "이벤트 전에 얼마나 많은 x"시간을 설정할 수있는 미리 알림 시스템이 있습니다. 예 : '5 분'으로 설정하면 이벤트 일정 5 분 전에 미리 알림을 받아야합니다.ActiveRecord에 대한 동적 시간 기반 파인더

내 알리미 시스템에는 매분마다 실행되는 cron이있어 알림 메일을 보냅니다. 여태까지는 그런대로 잘됐다.

: 나는 누구의 예약 된 시간 "5.minutes.from_now 및 6.minutes.from_now"나는 다음과 같은 where 절을 작성하려합니다

사이에 알림 (일정 항목을받을 수 있습니다 모든 캘린더 일정을 찾으려면 여기

conds = "'when' >= '#{eval("#{cal.remind_before.to_s}.#{cal.remind_before_what.downcase}.from_now").to_s(:db)}' AND 'when' < '#{eval("#{cal.remind_before.to_s}.#{cal.remind_before_what.downcase}.from_now + 1.minutes").to_s(:db)}'" 

@mail_calendar_for_reminder= Calendar.find(:all, :conditions=> conds)  

cal.reminder_before = '5'cal.remind_before_what.downcase = '분' 생성

때문에 평가는 (5.minutes.from_now) 및 (6.minutes.from_now)을 평가하는 것 SQL 문의 :

SELECT "calendars".* FROM "calendars" WHERE ('when' >= '2011-01-11 14:44:54' AND 'when' < '2011-01-11 14:45:54') 

이 SQL은 구문 적으로 그리고 논리적으로 5 분 .from_now 및 6.minutes.from_now 시간 범위를 갖기 때문에 정확합니다. 그러나 적절한 기록을 선택하지는 않습니다. 나는 두 가지를 의심한다 : 1. 위의 SQL은 시간 비교가 아닌 문자열 비교를하고있다. 2. 달력의 예약 시간에 대한 데이터베이스 항목의 형식은
2011-01-11 14:45:09입니다. - 0은 날짜 비교를 망칠 수 있습니다.

거의 모든 종류의 날짜 범위 산술을 시도했지만이 쿼리에서 적합한 레코드를 가져올 수 없습니다.

답변

0

서버 및 부하에 따라 cron의 1 분 창은 약간 낙관적 일 수 있습니다.

dbms 서버에 로그인하여 해당 SQL 문을 실행하면 어떻게됩니까? 모든 행이 반환됩니까? 오류 메시지가 있습니까?

명시 적 형식 캐스트를 시도 할 수 있습니다. 따라서

'when' >= CAST('2011-01-11 14:44:54' AS DATETIME) ... 

dbms에는 유형 변환 및 변환을위한 다른 구문이 필요할 수 있습니다. 문서를 검색하십시오.

대소 문자를 구분합니까? 열은 'when'또는 'when'입니까? (또는 그럴 필요가)

이 쿼리는 테스트 이벤트를 반환합니다. 열 이름 주위에 큰 따옴표를 적어 둡니다.

SELECT "calendars".* 
FROM "calendars" 
WHERE ("when" >= '2011-01-10 15:56' 
    AND "when" < '2011-01-10 15:57') 
+0

SELECT "캘린더". * "캘린더"WHERE ('언제'> = CAST ('DATETIME 2011-01-11 16시 54분 49초 AS)'및 ''< 'CAST FROM (2011- 01-11 16:55:49 'AS DATETIME)) - 데이터베이스에서 모든 행을 반환합니다. "when"열은 모두 소문자입니다. – Ved

+0

DDL 및 INSERT 문을 게시하여 문제를 보거나 재현 할 수 있습니까? –

+0

https://gist.github.com/776061 - 캘린더 모델의 DDL을 업데이트하십시오. 미리 감사드립니다. – Ved

관련 문제